Analysis
一道并不难的搜索题,只需要普通的DFS加上简单的剪枝即可。
Accepted Code
var
a,b:array[-1..5,-1..5] of longint;
find:boolean;
n,i,j:longint;
function check(i,j:longint):boolean;
var
tmp:longint;
begin
tmp:=0;
if (i>1) and (a[i-1,j]>a[i,j]) then
inc(tmp);
if (i<n) and (a[i+1,j]>a[i,j]) then
inc(tmp);
if (j>1) and (a[i,j-1]>a[i,j]) then
inc(tmp);
if (j<n) and (a[i,j+1]>a[i,j]) then
inc(tmp);
check:=tmp=b[i,j];
end;
procedure search(x,y:longint);
var
i:longint;
begin
if x=n+1 then
begin
find:=true;
for i:=1 to n do
find:=find and check(n,i);
exit;
end;
for i:=0 to 9 do
begin
a[x,y]:=i;
if (x=1) or check(x-1,y) then
if y=n then
search(x+1,1)
else
search(x,y+1);
if find then
break;
end;
end;
begin
read(n);
for i:=1 to n do
for j:=1 to n do
read(b[i,j]);
find:=false;
search(1,1);
if find then
begin
for i:=1 to n do
begin
for j:=1 to n-1 do
write(a[i,j],' ');
writeln(a[i,n]);
end;
end
else
writeln('NO SOLUTION');
end.