pascal马拦过河卒问题棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制
来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/24 04:21:00
pascal马拦过河卒问题棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制
pascal马拦过河卒问题
棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”.
棋盘用坐标表示,A点(0,0)、B点(n,m)(n,m为不超过20的整数),同样马的位置坐标是需要给出的.现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步.
【输入】
一行四个整数,分别表示B点坐标和马的坐标.
【输出】
一行一个整数,表示所有的路径条数.
【样例】
输入:
6 6 3 3
输出:
6
我是想问,怎么样防止卒重复走同一条路线,老师说回朔只回朔一步,
pascal马拦过河卒问题棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制
const
a:array[1..2]of byte=(0,1);ma1:array[1..8]of longint=(1,2,2,1,-1,-2,-2,-1);
b:array[1..2]of byte=(1,0);ma2:array[1..8]of longint=(2,1,-1,-2,-2,-1,1,2);
var
c:array[0..50,0..50]of int64;
d,i,j,l,m,n,k,o,p,q,x,y:longint;
begin
read(n,m,x,y);
fillchar(c,sizeof(c),0);
c[x,y]:=-1;
c[n+1,m]:=1;
for i:=1 to 8 do c[x+ma1[i],y+ma2[i]]:=-1;
for i:=n downto 0 do
for j:=m downto 0 do
if c[i,j]-1 then
c[i,j]:=c[i+1,j]+c[i,j+1]
else c[i,j]:=0;
write(c[0,0]);
end.
采用简单递推可得其规律,即(x,y)的可能性=(x-1,y)+(x,y-1)的可能性.注意数据可能达14位以上,所以应用int64或qword或extended(需注意小数).
没问题请采纳,有问题请追问.