骑士跳跃问题

骑士跳跃简单的说就是

在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++;
}
}

你可能感兴趣的:(编程)