国际象棋为许多令人着迷的娱乐提供了固定的框架,这些框架独立于游戏本身。其中很多都是基于奇异的骑士“L型”(L-shaped)移动。一个经典的例子就是骑士巡游(knight's tour)问题。
编写程序求解骑士巡游问题:在n行m列的棋盘上,输出一位骑士(按象棋中“马走日”的行走法)从(1,1)开始,遍历棋盘的顺序。
骑士的八种跳法用以下常量数组表示(表示每跳一步在行和列上的变化量):
const
dx:array [1..8] of integer=(-2,-1,1,2,2,1,-1,-2);
dy:array [1..8] of integer=(1,2,2,1,-1,-2,-2,-1);
输入
输入两个数n,m表示棋盘为n行m列。
输出
输出一个n行m列的矩阵(每个数场宽为3),第I行,第J列的数C,表示骑士在第C步时位于第I行,第J列。
样例输入
5 5
样例输出
1 20 17 12 3
16 11 2 7 18
21 24 19 4 13
10 15 6 23 8
25 22 9 14 5
const
dx:array [1..8] of integer=(-2,-1,1,2,2,1,-1,-2);
dy:array [1..8] of integer=(1,2,2,1,-1,-2,-2,-1);
var
a:array[1..100,1..100] of integer;
n,m,sum:longint;
procedure prt;
var i,j:integer;
begin
for i:=1 to n do
begin
for j:=1 to m do
write(a[i,j],' ');
writeln;
end;
inc(sum); writeln('==== ',sum,' ====='); {如只要一个解,将此行改为halt}
end;
procedure work(x,y,dep:longint);
var i:integer;
begin
a[x,y]:=dep;
if dep=n*m then prt
else begin
for i:=1 to 8 do
if (x+dx[i]>0)and(x+dx[i]<n+1)and(y+dy[i]>0)and(y+dy[i]<m+1)
then if (a[x+dx[i],y+dy[i]]=0) then
begin
work(x+dx[i],y+dy[i],dep+1);
a[x+dx[i],y+dy[i]]:=0;
end;
end;
end;
begin
readln(m,n);
work(1,1,1);
end.