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
#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
1个回答 分类:综合 2014-09-26

问题解答:

我来补答
我发百度消息你咋老不回呢?除了你所说的那个问题以外,
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,
 
 
展开全文阅读
剩余:2000