骑士跳跃问题

骑士跳跃简单的说就是

在8*8的国际象棋上任意位置放一个骑士(马),给出一个终点,求起点到终点的最短路径

//////////

这题大部人都使用回溯法,个人认为完全没有必要,使用广度搜索是最快的,不过编程实现没有采用回溯的广度搜索,而是通过穷尽进行广度搜索 ,代码量可以降低很多

/////////////代码如下

#include <stdio.h>

#include “memory.h”

unsigned char s[8][8],sx,sy,fx,fy;

unsigned char x[64],y[64];

int count =1;

/*

功能:得到下一步的所有可能位置

int cx :当前位置x轴坐标

int cy: 当前位置y轴坐标

int num:  当前步数

*/

int GetNext(int cx,int cy,int num)

{

int a,b;

/////////////////////////////////////8个方位

a=cx-2;

b=cy-1;

//判断该步在棋盘内且未走过

if( (a>=0)&&(a <8)&&(b>=0)&&(b <8)&&(s[a][b]==0) )

{

//记录步数

s[a][b]=num+1;

//记录下一位置

x[count]=a;

y[count]=b;

count++;

if((fx==a)&&(fy==b)) return 1;

}

a=cx-1;

b=cy-2;

//判断该步在棋盘内且未走过

if( (a>=0)&&(a <8)&&(b>=0)&&(b <8)&&(s[a][b]==0) )

{

//记录步数

s[a][b]=num+1;

//记录下一位置

x[count]=a;

y[count]=b;

count++;

if((fx==a)&&(fy==b)) return 1;

}

a=cx+1;

b=cy-2;

//判断该步在棋盘内且未走过

if( (a>=0)&&(a <8)&&(b>=0)&&(b <8)&&(s[a][b]==0) )

{

//记录步数

s[a][b]=num+1;

//记录下一位置

x[count]=a;

y[count]=b;

count++;

if((fx==a)&&(fy==b)) return 1;

}

a=cx+2;

b=cy-1;

//判断该步在棋盘内且未走过

if( (a>=0)&&(a <8)&&(b>=0)&&(b <8)&&(s[a][b]==0) )

{

//记录步数

s[a][b]=num+1;

//记录下一位置

x[count]=a;

y[count]=b;

count++;

if((fx==a)&&(fy==b)) return 1;

}

a=cx+2;

b=cy+1;

//判断该步在棋盘内且未走过

if( (a>=0)&&(a <8)&&(b>=0)&&(b <8)&&(s[a][b]==0) )

{

//记录步数

s[a][b]=num+1;

//记录下一位置

x[count]=a;

y[count]=b;

count++;

if((fx==a)&&(fy==b)) return 1;

}

a=cx+1;

b=cy+2;

//判断该步在棋盘内且未走过

if( (a>=0)&&(a <8)&&(b>=0)&&(b <8)&&(s[a][b]==0) )

{

//记录步数

s[a][b]=num+1;

//记录下一位置

x[count]=a;

y[count]=b;

count++;

if((fx==a)&&(fy==b)) return 1;

}

a=cx-1;

b=cy+2;

//判断该步在棋盘内且未走过

if( (a>=0)&&(a <8)&&(b>=0)&&(b <8)&&(s[a][b]==0) )

{

//记录步数

s[a][b]=num+1;

//记录下一位置

x[count]=a;

y[count]=b;

count++;

if((fx==a)&&(fy==b)) return 1;

}

a=cx-2;

b=cy+1;

//判断该步在棋盘内且未走过

if( (a>=0)&&(a <8)&&(b>=0)&&(b <8)&&(s[a][b]==0) )

{

//记录步数

s[a][b]=num+1;

//记录下一位置

x[count]=a;

y[count]=b;

count++;

if((fx==a)&&(fy==b)) return 1;

}

return 0;

}

void main()

{

int i=0,step=1;

int cul=0,temp;

//起点 StartX  StartY

//在这里输入起点

sx=1;

sy=1;

//终点 FianlX FinalY

//在这里输入终点

fx=3;

fy=1;

//初始化表

memset(s,0,8*8);

//

x[cul]=sx;

y[cul]=sy;

s[sx][sy]=1;

cul=0;

//判断起点是否等于终点

if( (sx==fx)&&(sy==fy) ) return;

while(1)

{

for(temp=count;cul <temp;cul++)

{

if(GetNext(x[cul],y[cul],step) )

{

printf(“step=%d/n”,step);

return;

}

}

step++;

}

}

    原文作者:骑士周游问题
    原文地址: https://blog.csdn.net/jiangbin00cn/article/details/2944493
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞