过河卒
时间限制: 1 Sec 内存限制: 128 MB
[提交][状态][讨论版]
题目描述
棋盘上的A点有一个过河卒,需要走到目标B点。卒行走的规则是:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如C点),对方的马所在的点和所 有跳跃一步可达的点称为对方马的控制点(如图中的C点和P1,P2,…,P8)。卒不能通过对方马的控制点。棋盘用坐标表示,A点(0,0),B点 (n,m)(n,m为不超过20的整数),同样马的位置坐标是需要给出的,C≠A且C≠B。现在输入B点和C点的坐标,要你计算出过河卒从A点能够到达B 点的路径的条数。
输入
一行,4个空格隔开的整数,表示(n,m)和C点的坐标。
输出
过河卒从A点能够到达B点的路径的条数。
样例输入
4 8 2 4
样例输出
0
题解
const
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);
var
n,m,x,y,i,j:longint;
g:array[0..20,0..20] of longint;
f:array[0..20,0..20] of double;
begin
readln(n,m,x,y);
fillchar(g,sizeof(g),0);
g[x,y]:=1;
for i:=1 to 8 do
if (x+dx[i]>=0) and (x+dx[i]<=n) and (y + dy[i]>=0) and (y+dy[i]<=m) then
g[x+dx[i],y+dy[i]]:=1;
f[0,0]:=1;
for i:=1 to n do
if g[i,0]=0 then f[i,0]:=f[i-1,0];
for i:=1 to m do
if g[0,i]=0 then f[0,i]:=f[0,i-1];
for i:=1 to n do
for j:=1 to m do
if g[i,j]=0 then f[i,j]:=f[i-1,j]+f[i,j-1];
writeln(f[n,m]:0:0)
end.