65 lines
1.4 KiB
ObjectPascal
65 lines
1.4 KiB
ObjectPascal
const
|
|
maxn=50;
|
|
dx:array[1..8] of integer=(0,1,1,1,0,-1,-1,-1);
|
|
dy:array[1..8] of integer=(-1,-1,0,1,1,1,0,-1);
|
|
var
|
|
a:array[1..maxn,1..maxn]of 0..1; {记录迷宫坐标}
|
|
c:array[1..maxn,1..maxn]of 0..1; {访问标志:0:没走;1:已走}
|
|
b:array[0..maxn*maxn] of integer; {记录路径方向}
|
|
n,x,y,i,j:integer;
|
|
count:longint;
|
|
procedure print(i:integer);
|
|
var j:integer;
|
|
begin
|
|
inc(count);
|
|
{x:=1;
|
|
y:=1;
|
|
write('(',x,',',y,')'); {初始位置}
|
|
for j:=1 to i do {输出路线}
|
|
begin
|
|
x:=x+dx[b[j]];
|
|
y:=y+dy[b[j]];
|
|
write('->','(',x,',',y,')');
|
|
end;
|
|
writeln;}
|
|
end;
|
|
|
|
procedure try(i:integer);{搜索第i步应到达的位置}
|
|
var k:integer;
|
|
begin
|
|
for k:=1 to 8 do
|
|
if (x+dx[k]>=1)and(x+dx[k]<=n)and(y+dy[k]>=1)and(y+dy[k]<=n) then
|
|
if (a[x+dx[k],y+dy[k]]=0)and(c[x+dx[k],y+dy[k]]=0) then
|
|
begin
|
|
x:=x+dx[k];
|
|
y:=y+dy[k];
|
|
c[x,y]:=1;
|
|
b[i]:=k;
|
|
if (x=n)and(y=1) then print(i)
|
|
else try(i+1);
|
|
c[x,y]:=0;
|
|
x:=x-dx[k];
|
|
y:=y-dy[k];
|
|
end;
|
|
end;
|
|
|
|
begin
|
|
assign(input,'migong.in'); reset(input);
|
|
assign(output,'migong.out');rewrite(output);
|
|
readln(n);
|
|
for i:=1 to n do
|
|
begin
|
|
for j:=1 to n do
|
|
begin
|
|
read(a[j,i]); {i:纵坐标;j:横坐标}
|
|
c[j,i]:=0;
|
|
end;
|
|
end;
|
|
x:=1;
|
|
y:=1;
|
|
c[1,1]:=1;
|
|
try(1);
|
|
writeln(count);
|
|
close(input);close(output);
|
|
end.
|