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.

Download