C语言——马拦过河卒.看看我的算法错哪了,并改正.
来源:学生作业帮 编辑:神马作文网作业帮 分类:综合作业 时间:2024/10/03 21:28:27
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
#include
int bollen(int mx,int my,int dx,int dy);
int db(int mx,int my,int dx,int dy);
int blen(int mx,int my,int dx,int dy);
main()//程序入口
{
int mx,my,dx,dy,result;
printf("请输入马的x,y坐标以及目的地的x,y坐标,并以逗号分开\n");
scanf("%d,%d,%d,%d",&mx,&my,&dx,&dy);
result=db(mx,my,dx,dy);
printf("一共有%d条路径\n",result);
}
int db(int mx,int my,int dx,int dy)//核心递归算法
{
int result;
if(dx>0&&dy>0&&bollen(mx,my,dx,dy))
result=db(mx,my,dx-1,dy)+db(mx,my,dx,dy-1);
else if(!bollen(mx,my,dx,dy))
result=0;
else if(dy==0||dx==0)
result=blen(mx,my,dx,dy);
return result;
}
int bollen(int mx,int my,int dx,int dy)//判断是否踩到马的控制点
{
if(abs(mx-dx)==1&&abs(my-dy)==2||abs(mx-dx)==2&&abs(my-dy)==1)
return 0;
else
return 1;
}
int blen(int mx,int my,int dx,int dy)//判断当dx或dy为0的时候,result应该是0还是1
{
static int a,b;
if(dy==0)
{
if(my0)
{
a=mx-3+my;
if(dx
要求:如图,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
#include
int bollen(int mx,int my,int dx,int dy);
int db(int mx,int my,int dx,int dy);
int blen(int mx,int my,int dx,int dy);
main()//程序入口
{
int mx,my,dx,dy,result;
printf("请输入马的x,y坐标以及目的地的x,y坐标,并以逗号分开\n");
scanf("%d,%d,%d,%d",&mx,&my,&dx,&dy);
result=db(mx,my,dx,dy);
printf("一共有%d条路径\n",result);
}
int db(int mx,int my,int dx,int dy)//核心递归算法
{
int result;
if(dx>0&&dy>0&&bollen(mx,my,dx,dy))
result=db(mx,my,dx-1,dy)+db(mx,my,dx,dy-1);
else if(!bollen(mx,my,dx,dy))
result=0;
else if(dy==0||dx==0)
result=blen(mx,my,dx,dy);
return result;
}
int bollen(int mx,int my,int dx,int dy)//判断是否踩到马的控制点
{
if(abs(mx-dx)==1&&abs(my-dy)==2||abs(mx-dx)==2&&abs(my-dy)==1)
return 0;
else
return 1;
}
int blen(int mx,int my,int dx,int dy)//判断当dx或dy为0的时候,result应该是0还是1
{
static int a,b;
if(dy==0)
{
if(my0)
{
a=mx-3+my;
if(dx
我发百度消息你咋老不回呢?除了你所说的那个问题以外,
if(abs(mx-dx)==1&&abs(my-dy)==2||abs(mx-dx)==2&&abs(my-dy)==1)这一句有问题
你判断掉了马所在的控制点
改成
if(abs(mx-dx)==1&&abs(my-dy)==2||abs(mx-dx)==2&&abs(my-dy)==1 || dx==mx && dy==my)
结果就是对的了
你的程度风格有点别扭,有些控制语句是多余的,还有就是在某些情况下,该算法还有bug,
if(abs(mx-dx)==1&&abs(my-dy)==2||abs(mx-dx)==2&&abs(my-dy)==1)这一句有问题
你判断掉了马所在的控制点
改成
if(abs(mx-dx)==1&&abs(my-dy)==2||abs(mx-dx)==2&&abs(my-dy)==1 || dx==mx && dy==my)
结果就是对的了
你的程度风格有点别扭,有些控制语句是多余的,还有就是在某些情况下,该算法还有bug,
C语言——马拦过河卒.看看我的算法错哪了,并改正.
C语言 16*16棋盘 马数小于4的马拦过河卒问题
求MATLAB大神看看我的算法怎么错了
帮我纠正下C语言题目 并改正
求高手帮我看看我写的这道C语言程序哪里错了!
求C语言大神帮忙看看哪错了
C语言 电文破译 题目和我编写的程序如下,请大神指出我错在哪里,并改正,答得好的追加.
用C语言描述下列算法,并给出算法的时间复杂度.
语文相关的,并将错误的选项帮我改正.错在哪了.
马拦过河卒 C语言特别经典的递如图,A 点有一个过河卒,需要走到目标 B 点.卒行走规则:可以向下、或者向右
C语言程序设:输入两个正整数m和n,求它们的最大公约数和最小公倍数.高手帮忙看看我设计的程序哪错了哈
求一道C语言题目,计算数学表达式2n/(n+m),看看我哪错了,执行不了