回朔法的pascal题目 看看错误在哪儿 谢谢

来源:百度知道 编辑:UC知道 时间:2024/05/26 13:30:45
第四题 过河卒
[问题描述]:
如图:A点有一个过河卒,需要走到目标B点。卒行走的规则:可以向下,或者向右。同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达到的点称为对方马的控制点。例如上图C点上的马可以控制9个点(图中的P1,P2……P8和C)。卒不能通过对方马的控制点。
棋盘用坐标表示,A点(0,0)、B点(n,m) (n,m为不超过20的整数,并由键盘输入),同样马的位置坐标是需要给出的(约定:C≠A,同时C≠B)。现在要求你计算出卒从A点能够到达B点的路径的条数。

[输入]:
键盘输入
B点的坐标(n,m)以及对方马的坐标(X,Y) {不用判错}
[输出]:
屏幕输出
一个整数(路径的条数)。
[输入输出样例]:
输入:
6 6 3 2
输出:
17

【图传不上来了】
program ex4;
const
cannotx:array[1..8]of integer=(2,1,-1,-2,-2,-1,1,2);
cannoty:array[1..8]of integer=(1,2,2,1,-1,-2,-2,-1);
walkx:array[1..2]of integer=(1,0);
walky:array[1..2]of integer=(0,1);
var
n,m,x,y,total,i:integer;
a:array[1..20,1..20]of integer;
procedure try(c,d:integer);
var
u,v:integer;
begin
for i:=1 to 2 do
begin
u:=c+walkx[i];
v:=d+walky[i];
if a[u,v]<&g

这个不能用回朔,会超时,要用递推:
program liukevijos1121;
var
a:array[-5..50,-5..50] of longint;
i,j,k,m,n,x,y:longint;
begin
readln(m,n,x,y);
a[x,y]:=-1;
a[x-2,y-1]:=-1;
a[x-2,y+1]:=-1;
a[x-1,y-2]:=-1;
a[x-1,y+2]:=-1;
a[x+1,y+2]:=-1;
a[x+1,y-2]:=-1;
a[x+2,y+1]:=-1;
a[x+2,y-1]:=-1;
for i:=0 to n do
if a[0,i]=-1 then break else a[0,i]:=1;
for i:=0 to m do
if a[i,0]=-1 then break else a[i,0]:=1;
for i:=0 to n do
if a[0,i]=-1 then a[0,i]:=0;
for i:=0 to m do
if a[i,0]=-1 then a[i,0]:=0;
for i:=1 to m do
for j:=1 to n do
if a[i,j]=-1 then a[i,j]:=0 else a[i,j]:=a[i-1,j]+a[i,j-1];
writeln(a[m,n]);
end.