马拦过河卒pascal(题目,分析,样例输入输出,源程序,感受)
马拦过河卒
源程序名 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 36
输入: (4 2 8 8) (4 3 9 8)
输出: 4 10
源程序:
program ghz;
var z:array[1..100,1..100]of boolean; p,q:array[1..100,1..100]of byte; xb,yb,xm,ym,s:integer; pest:boolean;
procedure falss;
begin
z[xm,ym]: false;
z[xm-1,ym-2]: false;
z[xm-2,ym-1]: false;
z[xm-2,ym+1]: false;
z[xm-1,ym+2]: false;
z[xm+1,ym-2]: false;
z[xm+2,ym-1]: false;
z[xm+1,ym+1]: false;
z[xm+1,ym+2]: false;
end;
procedure writee x,y:integer ;
var u:byte;
begin if x 1 and y 1 then begin writeln ' 1,1 ' ; writeln; end else begin write ' ',x,',',y,' -- ' ; writee p[x,y],q[x,y] ; end;
end;
procedure print;
var i,j:integer;
begin pest: false; s: s+1; writee xb,yb ;
end;
procedure try x,y:integer ;
var i,j,w:integer;
begin if x xb or y yb then i: 1 else if x xb and y yb then print else for i: 1 to 2 do begin if i 1 and z[x+1,y] true then begin p[x+1,y]: x; q[x+1,y]: y; try x+1,y ; end; if i 2 and z[x,y+1] true then begin p[x,y+1]: x; q[x,y+1]: y; try x,y+1 ; end; end;
end;
begin
assign 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.
感受:
初始化部分偏长需要改进,文件读入读出,而且考虑到了无解情况,总体比较全面。
第一次自己做对了,好高兴也!