马拦过河卒
源程序名 knight.???(pas, c, cpp) 可执行文件名 knight.exe 输入文件名 knight.in 输出文件名 knight.out |
【问题描述】
棋盘上A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下、或者向右。同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。
棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过15的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步。
【输入】
一行四个数据,分别表示B点坐标和马的坐标。
【输出】
一个数据,表示所有的路径条数。
【样例】
knight.in knight.out
6 6 3 3 6
========
一个递推
========
var
f:array[0..16,0..16]of boolean;
ft:array[-1..16,-1..16]of longint;
x1,y1,x2,y2:longint;
procedure init;
begin
assign(input,'knight.in');
assign(output,'knight.out');
reset(input); rewrite(output);
end;
procedure terminate;
begin
close(input); close(output); halt;
end;
procedure main;
var
i,j:longint;
begin
readln(x1,y1,x2,y2);
fillchar(f,sizeof(f),true);
f[x2,y2]:=false;
f[x2-1,y2+2]:=false;
f[x2+1,y2+2]:=false;
f[x2-2,y2+1]:=false;
f[x2+2,y2+1]:=false;
f[x2-2,y2-1]:=false;
f[x2+2,y2-1]:=false;
f[x2-1,y2-2]:=false;
f[x2+1,y2-2]:=false;
fillchar(ft,sizeof(ft),0);
{for i:=0 to x1 do
for j:=0 to y1 do
if not f[i,j] then
begin
writeln(i,' ',j);
end; }
ft[0,0]:=1;
for i:=0 to x1 do
for j:=0 to y1 do
if f[i,j] then
begin
ft[i,j]:=ft[i,j]+ft[i-1,j]+ft[i,j-1];
end;
writeln(ft[x1,y1]);
end;
begin
init;
main;
terminate;
end.
=====