1、马拦过河卒源程序名 knight.?(pas, c, cpp) 可执行文件名 knight.exe输入文件名 knight.in 输出文件名 knight.out【问题描述】棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒” 。棋盘用坐标表示,A 点(0, 0)、B 点(n, m)(n, m 为不超过 15 的整数),同样马的位置坐标是需要给出的。现在要求你计算出卒从 A 点能够到达 B 点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走
2、一步。【输入】一行四个数据,分别表示 B 点坐标和马的坐标。【输出】一个数据,表示所有的路径条数。【样例】knight.in knight.out6 6 3 3 6输入: (4 2 8 8) (4 3 9 8) 输出: 4 10源程序:program ghz;var z:array1100,1100of boolean;p,q:array1100,1100of byte;xb,yb,xm,ym,s:integer;pest:boolean;procedure falss;beginzxm,ym:=false;zxm-1,ym-2:=false;zxm-2,ym-1:=false;zxm-2,y
3、m+1:=false;zxm-1,ym+2:=false;zxm+1,ym-2:=false;zxm+2,ym-1:=false;zxm+1,ym+1:=false;zxm+1,ym+2:=false;end;procedure writee(x,y:integer);var u:byte;beginif (x=1) and (y=1) then begin writeln( 1,1 ); writeln; endelsebeginwrite( ,x,y, );writee(px,y,qx,y);end;end;procedure print;var i,j:integer;beginpest
4、:=false;s:=s+1;writee(xb,yb);end;procedure try(x,y:integer);var i,j,w:integer;beginif (xxb) or (yyb) then i:=1 elseif (x=xb) and (y=yb) then printelsefor i:=1 to 2 dobeginif (i=1) and (zx+1,y=true) then begin px+1,y:=x; qx+1,y:=y; try(x+1,y); end;if (i=2) and (zx,y+1=true) then begin px,y+1:=x; qx,y
5、+1:=y; try(x,y+1); end;end;end;beginassign(input,word.in);assign(output,word.out);reset(input);rewrite(output);readln(xb,yb,xm,ym);fillchar(z,sizeof(z),true);falss;pest:=true;s:=0;try(1,1);if pest=true then writeln(Sorry!No Answer);writeln(There are ,s, answers!);close(input);close(output);end.感受:初始化部分偏长需要改进,文件读入读出,而且考虑到了无解情况,总体比较全面。第一次自己做对了,好高兴也!