马拦过河卒 C语言特别经典的递如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下、或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳
来源:学生作业帮助网 编辑:六六作业网 时间:2025/01/25 08:02:15
马拦过河卒 C语言特别经典的递如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下、或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳
马拦过河卒 C语言
特别经典的递
如
图,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
能帮我看看哪错了么.能过例子,提交的时候是一组数据正确,两组数据超时,两组数据错误.
#include <stdio.h>
int map[21][21]={0};
int n,m,x,y;
int main(){
int i,j;
long long count;
long long way(int x1,int y1);
scanf("%d%d%d%d",&n,&m,&x,&y);
for(i=0;i<=n;i++)
{
for(j=0;j<=m;j++)
{
map[i][j]=1;
}
}
map[x][y]=0;
map[x-1][y-2]=0;
map[x-1][y+2]=0;
map[x+1][y-2]=0;
map[x+1][y+2]=0;
map[x-2][y-1]=0;
map[x-2][y+1]=0;
map[x+2][y-1]=0;
map[x+2][y+1]=0;
count=way(n,m);
printf("%lld",count);
return 0;
}
long long way(int x1,int y1)
{
long long result;
if(map[x1][y1]==1)
{
if(y1==0&&x1>0)
{
result=way(x1-1,0);
}
if(x1==0&&y1>0)
{
result=way(0,y1-1);
}
if(x1>0&&y1>0)
{
result=way(x1-1,y1)+way(x1,y1-1);
}
if(x1==0&&y1==0)
{
result=1;
}
}
else
{
result=0;
}
return(result);
}
马拦过河卒 C语言特别经典的递如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下、或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳
把下面这段检查下,x-1,x-2,y-1,y-2是否有越界?
map[x][y]=0; map[x-1][y-2]=0; map[x-1][y+2]=0; map[x+1][y-2]=0; map[x+1][y+2]=0; map[x-2][y-1]=0; map[x-2][y+1]=0; map[x+2][y-1]=0; map[x+2][y+1]=0;