马拦过河卒 C语言特别经典的递如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下、或者向右
来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/05/22 11:53:55
马拦过河卒 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);
}
特别经典的递
如
图,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);
}
把下面这段检查下,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;
再问: 恩。我按照你说的,多设置了几个if 保证那些个数组不越界。现在是两组数据成功,三组数据超时。。按理说我用的递归公式应该不会导致超时啊
再答: 如果只是超时,说明数据运算量大的问题,优化下程序吧,比如说改成如下这段,可能会有帮助。long long way(int x1,int y1)
{
if(map[x1][y1])
{
if(!y1 && x1 )return way(x1-1,0);
if(!x1 && y1 ) return way(0,y1-1);
if(x1 && y1 ) return way(x1-1,y1)+way(x1,y1-1);
if(!x1 && !y1 )return 1;
}
else return 0;
} 如果还超时,那就彻底改算法吧,可以用动态规划(Dynamic Programming)来做,下面代码供参考,(dp看不懂的话上网baidu下)//DP
unsigned long f[21]={0};
/边界
f[0]=1;
i=1;
while(map[0][i]&&i<=m)
f[i++]=1;
for(i=1;i<=n;i++)
{
if(!map[i][0])f[0]=0;
for(j=1;j<=m;j++)
if(map[i][j])
f[j]=f[j]+f[j-1];
else f[j]=0;
}
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;
再问: 恩。我按照你说的,多设置了几个if 保证那些个数组不越界。现在是两组数据成功,三组数据超时。。按理说我用的递归公式应该不会导致超时啊
再答: 如果只是超时,说明数据运算量大的问题,优化下程序吧,比如说改成如下这段,可能会有帮助。long long way(int x1,int y1)
{
if(map[x1][y1])
{
if(!y1 && x1 )return way(x1-1,0);
if(!x1 && y1 ) return way(0,y1-1);
if(x1 && y1 ) return way(x1-1,y1)+way(x1,y1-1);
if(!x1 && !y1 )return 1;
}
else return 0;
} 如果还超时,那就彻底改算法吧,可以用动态规划(Dynamic Programming)来做,下面代码供参考,(dp看不懂的话上网baidu下)//DP
unsigned long f[21]={0};
/边界
f[0]=1;
i=1;
while(map[0][i]&&i<=m)
f[i++]=1;
for(i=1;i<=n;i++)
{
if(!map[i][0])f[0]=0;
for(j=1;j<=m;j++)
if(map[i][j])
f[j]=f[j]+f[j-1];
else f[j]=0;
}
马拦过河卒 C语言特别经典的递如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下、或者向右
过河卒救急棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个对方的马,该
【问题描述】棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上C点有一个对方的马,
A点有一个卒,需要走到目标B点.行走规则:可以向下(共4步)或者向右(共8步).要求计算从A能够到达B的路径的条数,并输
C语言 16*16棋盘 马数小于4的马拦过河卒问题
马的走法C语言算法半张中国象棋棋盘,即5×9棋盘,左上角记为A(1,1),求从A点的马,只能向右行走,走到点B(m,n)
过河卒,24点 pascal语言程序.(我是初学者写的易懂点 能省过程、函数尽量省)
pascal马拦过河卒
C语言——马拦过河卒.看看我的算法错哪了,并改正.
过河卒问题(部分),A到B一共多少条路径,怎么数的.
过河卒 动画一个叫过河卒的动画帮忙找下没错 以前看到一半有事情走了
pascal马拦过河卒问题