烈光1浮光掠影百度云:pascal跳马问题

来源:百度文库 编辑:中科新闻网 时间:2024/04/29 15:27:14
设一个m*n的棋盘(如下图4是一个8*4的棋盘),在棋盘上的A点(0,0)有一个中国象棋的马,并约定马走的规则是:
1. 马走日字;
2. 马只能向右走;
任务:
编程读入m,n,请打印出一条从A(0,0)到B(m,n)的路径。

要分析,和程序

由于是要写出路径,且棋盘不太大,宜用穷举法,即设计一个让电脑模拟棋子在棋盘上走出所有可能的路径,将符合条件的路径记录下来的方法。
分析:
为模拟马,则应先规定马的走法:1,向上;2,斜向上;3,斜向下;4,向下。因为棋盘大小有规定,如果马走时,走出棋盘,则应让马返回上一步(即未出格前)。有可能根本找不到符合的路径,当所有可能都走过后,若仍找不到,则应停止,并输出相应的结果:无解。
算法分析:
1)记录初始位置。
2)让棋子在棋盘上走(方法1、2、3或4),并记录每次走法(用数组),及当前位置(程序中用两个变量i,j)。
3)判断有无出格,若有则后退,在上一位置尝试下一走法,若上一位置已尝试所有走法,返回上上一位置(利用当前位置及最近走的方法),无出格则继续。
4)判断是否无解(棋在初始位置,且方法1、2、3、4及其后续均已尝试且无结果,则无解),无解则终止,否则继续。
5)因为只需1条路径,当棋子到达目的地,则停止,否则回到2)。

注:在2)、3)中,记录当前位置,无法前进而后退时,用了回溯的思想,这是用穷举法时常用的方法。

附程序如下:

var i,j,k,m,n:integer;
ans:array[1..15]of integer;
cf:boolean;
{i,j记录当前位置行和列;k为控制第几步的变量;ans记录走法;cf记录是否无解}
procedure qj(s:integer);{为方便,设置前进的方法}
begin
case s of
1:
begin
i:=i+2;
j:=j+1;
end;
2:
begin
i:=i+1;
j:=j+2;
end;
3:
begin
i:=i-1;
j:=j+2;
end;
4:
begin
i:=i-2;
j:=j+1;
end;
end;
end;
procedure ht(s:integer);{后退的方法}
begin
case s of
1:
begin
i:=i-2;
j:=j-1;
end;
2:
begin
i:=i-1;
j:=j-2;
end;
3:
begin
i:=i+1;
j:=j-2;
end;
4:
begin
i:=i+2;
j:=j-1;
end;
end;
end;

begin
for k:=1 to 15 do
ans[k]:=0;
i:=0;
j:=0;
k:=1;
cf:=false;
read(m,n);
{初始化完毕}
while ((i<>m)or(j<>n))and(cf=false) do {寻找符合条件的走法}
begin
inc(ans[k]);
if ans[k]<5 then
begin
qj(ans[k]);
if (i<4)and(j<n+1) then inc(k)
else
begin
ht(ans[k]);
end;
end
else
begin
ans[k]:=0;
dec(k);
ht(ans[k]);
end;
if (k=1) and (ans[1]=4) then cf:=true;
end;
{输出结果}
k:=1;
i:=0;
j:=0;
if cf then writeln('no answer')
else{由于记录的是走法,应按要求,还原成路径;}
begin
write('(0,0)');
repeat
qj(ans[k]);
write('-->( ',i,',','j',')');
inc(k);
until ans[k]=0;
writeln;
end.

有什么办法呢,搜索。这种问题来www.oibh.org

楼上已很详细了。