骑士巡游问题

 

国际象棋为许多令人着迷的娱乐提供了固定的框架,这些框架独立于游戏本身。其中很多都是基于奇异的骑士“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.

 

posted @ 2015-11-23 15:18  qilinart  阅读(1973)  评论(0)    收藏  举报