NKMINES - Trò chơi dò mìn
Tác giả: flashmt
Ngôn ngữ: Pascal
uses math;
const fi='';
maxn=210;
dx:array[1..8] of longint=(-1,-1,-1,0,0,1,1,1);
dy:array[1..8] of longint=(-1,0,1,-1,1,-1,0,1);
type ar=array[1..maxn,1..maxn] of longint;
var n,m,dem:longint;
a,b:ar;
qx,qy:array[0..maxn*maxn] of longint;
procedure rf;
var i,j:longint;
begin
read(m,n);
for i:=1 to m do
for j:=1 to n do
read(b[i,j]);
qx[1]:=1; qy[1]:=1; dem:=1;
for i:=3 to m+n do
for j:=max(1,i-n) to min(m,i-1) do
begin
inc(dem);
qx[dem]:=j; qy[dem]:=i-j;
end;
end;
procedure wf;
var i,j:longint;
begin
for i:=1 to m do
begin
for j:=1 to n do write(a[i,j],' ');
writeln;
end;
halt;
end;
procedure edit(x,y,val:longint);
var xx,yy,i:longint;
begin
for i:=1 to 8 do
begin
xx:=x+dx[i]; yy:=y+dy[i];
if (xx>0) and (xx<=m) and (yy>0) and (yy<=n) then
b[xx,yy]:=b[xx,yy]+val;
end;
end;
function ok:boolean;
var i:longint;
begin
for i:=1 to n do
if b[m,i]<>0 then exit(false);
for i:=1 to m do
if b[i,n]<>0 then exit(false);
exit(true);
end;
procedure att(p:longint);
var i,j,x,y,xx,yy:longint; c0,c1:boolean;
begin
if p>dem then
begin
if ok then wf
else exit;
end;
x:=qx[p]; y:=qy[p];
c0:=true; c1:=true;
if (x>1) and (y>1) then
begin
if b[x-1,y-1]<>0 then c0:=false;
if b[x-1,y-1]<>1 then c1:=false;
end;
if c0 then
begin
a[x,y]:=0;
att(p+1);
end;
if c1 then
begin
a[x,y]:=1;
edit(x,y,-1);
att(p+1);
edit(x,y,1);
end;
end;
procedure pr;
begin
att(1);
end;
begin
assign(input,fi); reset(input);
rf;
pr;
close(input);
end.