马拦过河卒题解:

题目描述:
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。
马拦过河卒题解:_第1张图片

同时在棋盘上的任一点有一个对方的马(如下图中的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图C点的马可以控制九个点(如图中的C点和P1,P2,……,P8)。卒不能通过对方马的控制点。
棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过20的整数),同样马的位置坐标是需要给出的,C≠A且C≠B。
现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
input
6 6 3 2
output
17
很简单,用类似迷宫的方法即可:
var
dx:array[1..8]of longint=(2,1,-1,-2,-2,-1,1,2);
dy:array[1..8]of longint=(1,2,2,1,-1,-2,-2,-1);
dx1:array[1..2]of longint=(0,1);
dy1:array[1..2]of longint=(1,0);
w,w1:array[1..8]of longint;
a:array[0..100,0..100]of longint;
x1,y1,x2,y2,i,j,ans:longint;
procedure road(xx,yy:longint);
var
i1,bz,bz1:longint;
begin
if (xx=x1)and(yy=y1) then
ans:=ans+1;
for i1:=1 to 2 do
begin
bz:=xx+dx1[i1];
bz1:=yy+dy1[i1];
if (bz>=0)and(bz<=x1)and(bz1>=0)and(bz1<=y1)and(a[bz,bz1]=0) then
begin
a[bz,bz1]:=1;
road(bz,bz1);
a[bz,bz1]:=0;
end;
end;
end;
begin
readln(x1,y1,x2,y2);
for i:=1 to 8 do
begin
w[i]:=x2+dx[i];
w1[i]:=y2+dy[i];
a[w[i],w1[i]]:=1;
end;
a[x2,y2]:=1;
road(0,0);
writeln(ans);
end.

你可能感兴趣的:(马拦过河卒题解:)