pascal编程:过河卒题目描述  棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对

来源:学生作业帮助网 编辑:作业帮 时间:2024/11/17 00:17:09

pascal编程:过河卒题目描述  棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对
pascal编程:过河卒
题目描述  
棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”.  
棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过20的整数),同样马的位置坐标是需要给出的.  现在要求你计算出卒从A点能够到达B点的路径的条数,假设马的位置是固定不动的,并不是卒走一步马走一步.
输入格式
一行四个数据,分别表示B点坐标和马的坐标.
输出格式
一个数据,表示所有的路径条数.
样例输入
6 6 3 3
样例输出
6
注释结果可能很大!

pascal编程:过河卒题目描述  棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对
【问题分析】
跳马是一道老得不能再老的题目,每位编程者都学过,一般是在学习回溯或搜索算法时,很多书上也有类似的题目,一些比赛中也经常出现这一问题的变形(如NOIP1997初中组第三题).有些同学一看到这种类型的题目就去盲目搜索,但事实证明:当n,m=15就会超时.
其实,对本题稍加分析就能发现,到达棋盘上的一个点,只能从左边过来(我们称之为左点)或是从上面过来(我们称之为上点).根据加法原理,到达某一点的路径条数,就等于到达其相邻的上点或左点的路径数目总和.因此我们可以使用逐列(逐行)递推的方法来求出从起点到终点的路径数目.障碍点(马的控制点)也完全适用,只要将到达该点的路径数目设置为0即可.
假设用F[I,J]到达点(I,J)的路径数目用G[I,J]表示点(I,J)是否为对方马的控制点,G[I,J]=0表示不是对放马的控制点,G[I,J]=1表示是对方马的控制点.则,我们可以得到如下的递推关系式:
F[I,J]=0               {G[I,J]=1}
F[I,0]=F[I-1,0]         {I>0,G[I,0]=0}
F[0,J]=F[0,J-1]         {J>0,G[0,J]=0}
F[I,J]=F[I-1,J]+F[I,J-1]  {I>0,J>0,G[I,J]=0}
上述递推式边界是:F[0,0]:=1.考虑到最大情况下:n=20,m=20,路径条数可能会出现超出长整型范围,所以要用int64或comp类型计数或者高精度运算.
【参考程序】
const dx:array[1..8] of integer=(-2,-1,1,2,2,1,-1,-2);
      dy:array[1..8] of integer=(1,2,2,1,-1,-2,-2,-1);
var n,m,x,y,i,j:integer;
    g:array[0..20,0..20] of boolean;
    f:array[0..20,0..20] of int64;
begin
 readln(n,m,x,y);
 g[x,y]:=true;
 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]]:=true;
 f[0,0]:=1;
 for i:=1 to n do
  if not(g[i,0]) then
   f[i,0]:=f[i-1,0];
 for i:=1 to m do
  if not(g[0,i]) then 
   f[0,i]:=f[0,i-1];
 for i:=1 to n do
  for j:=1 to m do
   if not(g[i,j]) then
    f[i,j]:=f[i-1,j]+f[i,j-1];
 writeln(f[n,m]);
end.

pascal编程:过河卒题目描述  棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对 pascal编程:哥德巴赫猜想题目描述输入N(N pascal编程:方格取数题目描述设有N*N的方格图(N 过河卒,24点 pascal语言程序.(我是初学者写的易懂点 能省过程、函数尽量省)过河卒:棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个 pascal马拦过河卒棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点. pascal马拦过河卒问题棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制 过河卒(pascal)棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上的任一点有一个对方的马(如下图中的C点),该马所在的点和所有跳跃一步可达的点 pascal马栏过河卒修改棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制 C语言 16*16棋盘 马数小于4的马拦过河卒问题 【问题描述】棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因 一道编程题目pascal:用辗转相除法求两数的最大公约数. pascal 编程输入下列图案 哥德巴赫猜想 多少组解 pascal【题目描述】任一个充分大的偶数N(4 用pascal语言编程:输出n(n pascal编程:统计数字题目描述某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到 pascal编程:数列题目描述给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是:1,3,4,9,10,12,13,…(该序列实际上就是:3 pascal编程:阶乘题目描述用高精度计算出S=1!+2!+3!+…+n!(n≤50) 其中“!”表示阶乘,例如:=5*4*3*2*1.输入格式一个正整数N.输出格式一个正整数S,表示计算结果.样例输入 3 样例输出 9 过河卒救急棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.棋盘