#!/usr/bin/perl #made by Qajin $* = 1; $debug=0; $c = join('','1'..'9','a'..'z'); $size = 9; $subsize = sqrt($size); for($i=0;$i<$size;$i++) { $mt .= <>; } &fill_matrix($mt); sub fill_matrix { local(@mt) = split("\n",$_[0]); local($i); local($x,$y,$suppose,$sx,$sy,$sl); local($m,$om) = ($_[0],''); until($om eq $m || $m !~ / /) { $om = $m; $sl = $size+1; for ($y=0; $y<$size; $y++) { for ($x=0; $x<$size; $x++) { next if substr($mt[$y],$x,1) ne ' '; # rows $deny = $mt[$y]; #columns for($i=0; $i<$size; $i++) { $deny .= substr($mt[$i],$x,1); } #sub-matrix for($i=0; $i<$subsize; $i++) { $deny .= substr($mt[$y-$y%$subsize+$i],$x-$x%$subsize,$subsize); } $deny =~ s/ //g; $possible = substr($c,0,$size); $possible =~ s/[$deny]//g if $deny ne ''; $l = length($possible); if ($l == 1) { substr($mt[$y],$x,1) = $possible; } elsif ($l < $sl) { ($sx,$sy,$sl,$suppose) = ($x,$y,$l,$possible); } } } $m = join("\n",@mt); print $m,"\n---\n" if $debug == 1; } if ($m !~ / /) { print $m,"\n---\n"; return; } for($i=0;$i<$sl;$i++) { substr($mt[$sy],$sx,1) = substr($suppose,$i,1); printf "suppose %s in (%d,%d)\n",substr($suppose,$i,1),$sx,$sy if $debug == 1; &fill_matrix(join("\n",@mt)); } }