C语言——马拦过河卒.看看我的算法错哪了,并改正.要求:如图,A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点
来源:学生作业帮助网 编辑:作业帮 时间:2024/07/20 05:51:18
![C语言——马拦过河卒.看看我的算法错哪了,并改正.要求:如图,A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点](/uploads/image/z/2479854-30-4.jpg?t=C%E8%AF%AD%E8%A8%80%E2%80%94%E2%80%94%E9%A9%AC%E6%8B%A6%E8%BF%87%E6%B2%B3%E5%8D%92.%E7%9C%8B%E7%9C%8B%E6%88%91%E7%9A%84%E7%AE%97%E6%B3%95%E9%94%99%E5%93%AA%E4%BA%86%2C%E5%B9%B6%E6%94%B9%E6%AD%A3.%E8%A6%81%E6%B1%82%EF%BC%9A%E5%A6%82%E5%9B%BE%2CA%E7%82%B9%E6%9C%89%E4%B8%80%E4%B8%AA%E8%BF%87%E6%B2%B3%E5%8D%92%2C%E9%9C%80%E8%A6%81%E8%B5%B0%E5%88%B0%E7%9B%AE%E6%A0%87B%E7%82%B9.%E5%8D%92%E8%A1%8C%E8%B5%B0%E7%9A%84%E8%A7%84%E5%88%99%EF%BC%9A%E5%8F%AF%E4%BB%A5%E5%90%91%E4%B8%8B%E3%80%81%E6%88%96%E8%80%85%E5%90%91%E5%8F%B3.%E5%90%8C%E6%97%B6%E5%9C%A8%E6%A3%8B%E7%9B%98%E4%B8%8A%E7%9A%84%E4%BB%BB%E4%B8%80%E7%82%B9%E6%9C%89%E4%B8%80%E4%B8%AA%E5%AF%B9%E6%96%B9%E7%9A%84%E9%A9%AC%EF%BC%88%E5%A6%82%E4%B8%8A%E5%9B%BE%E7%9A%84C%E7%82%B9)
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
#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
C语言——马拦过河卒.看看我的算法错哪了,并改正.要求:如图,A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点
我发百度消息你咋老不回呢?除了你所说的那个问题以外,
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,