c语言读取控制点文件,C语言——马拦过河卒.看看我的算法错哪了,并改正.要求:如图,A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C...

b357216499010bdf2c78f9eb61d172be.pngC语言——马拦过河卒.看看我的算法错哪了,并改正.要求:如图,A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下、或者向右.同时在棋盘上的任一点有一个对方的马(如上图的C点

2016-01-24

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一道描述棋盘规则的问题。给出了三个点aa、bb、cc,要求从aa点到bb点一步,需要沿下方向或者向右方向。同时,在棋盘上有一个对方的马,该所在的点和所有跳跃一步可达的点称为对方控制点。因此,需要注意能够到达bb点的点必须不在对方控制点上。这个问题称为“”。 ### 回答2: 这道题类似于迷宫探索。我们可以把棋盘看成一个坐标系,的位置为起点,目标点为终点。既然只能向下向右移动,那么我们只需要向着目标点最短的方向移动,直到到达目标点即可。 但是,这道题的难点在于对方的马。因为能够控制到的点都是对的威胁,所以我们需要先判断对方能否对造成威胁。如果对方距离的横向距离大于等于3,纵向距离大于等于3,则该无法将截,可以直接行走。如果对方距离的横向距离小于2,纵向距离小于2,则该直接将截。如果对方距离的横向距离等于2,纵向距离等于2,则需要根据对方的具体位置进行判断。 如果对方距离的横向距离等于2,纵向距离等于2,可以划分成四个方向判断。以对方的位置为中心,向四个方向分别判断对应的点是否存在,如果存在则需要判断对方是否能够到达该点,如果能够到达,则该点受到对方的威胁。 如果能够避开对方的威胁,就可以按照最短路径向目标点靠近。如果不能避开对方的威胁,就需要考虑如何绕路。可以考虑分别向上和向左一步,检查两个新点是否受到对方的威胁,如果有威胁则需要再次绕路,直到找到安全的路径。 总之,在这种情况下,我们需要通过细致的分析来找出最优解决方案,保证能够安全到达目标点。 ### 回答3: 过是中国象棋中的一种棋子,只能向前,且要过后才能横着。现在有一个过需要目标点,但是在棋盘上还有一个对方的马,要阻止过的前进。 首先,我们需要了解棋盘的基本结构,其实就是一个8*8的方格棋盘。每个象棋棋子的行走路线都有它们自己的规则和限制。过可以向下向右,但是不能向上或者向左。所以我们需要根据这个规则来寻找到达目标点的最短路径。 而对方的马则是另一个挑战。行走路线是一个“日”字形。当它的位置在过前进的路径上或者可以跳到过的行进路线上时,过就会被住。因此,我们需要绕过对方的马,选择路径避开对方控制点。 面对这个问题,我们可以通过回溯算法来解决。回溯算法是一种广泛使用的算法,可以用来寻找所有有效的路径。我们可以从起点开始,每次尝试向下向右移动一步,同时检查是否到达了目标点,并考虑到对方控制点会对路径产生影响。如果被对方住,我们需要绕路避开控制点,然后继续前进。最终,当找到一条到达目标点的有效路径时,就可以停止搜索。 总之,找到过目标点的最短路径并绕开对方控制点是一个有挑战性的问题,但通过回溯算法,我们可以找到所有的有效路径,并且选出最短路径来解决这个问题。再复杂的问题,只要用正确的方法,都可以被解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值