#include <stdio.h>
#include <malloc.h>
#define
N
8
#define
TRUE
1
#define
FALSE
0
int
HTry1[]={-2,-1,1,2,2,1,-1,-2};
int
HTry2[]={1,2,2,1,-1,-2,-2,-1};
int
map[N][N]={0};
//使用数组map表示8*8的棋盘
int
board[N*N]={0};
//使用数组board表示马每次走的方向
int
count=0;
typedef
struct
Position
{
int
x;
int
y;
struct
Position
*next;
}StackNode,*StackList;
void
InitStack(StackList
*horse)
{
*horse=(StackList)malloc(sizeof(StackNode));
(*horse)-> next=NULL;
}
int
Push(StackList
horse,int
x,int
y)
{
StackNode
*temp;
temp=(StackList)malloc(sizeof(StackNode));
if(temp==NULL)
return
FALSE;
temp-> x=x;
temp-> y=y;
temp-> next=horse-> next;
horse-> next=horse;
return
TRUE;
}
int
Pop(StackList
horse,int
*x,int
*y)
{
StackNode
*temp;
temp=horse-> next;
if(temp==NULL)
return
FALSE;
else
{
*x=temp-> x;
*y=temp-> y;
horse-> next=temp-> next;
free(temp);
return
TRUE;
}
}
int
CanJump(int
i,int
j)
{
if(i> =0&&i <8&&j> =0&&j <8&&map[i][j]==0)
return
TRUE;
return
FALSE;
}
//判断map[i][j]是否可以走
void
HorseTravel(StackList
horse,int
x,int
y)
{
int
i,j,start=0;
Push(horse,x,y);
map[x][y]=count+1;
while(count!=64)
{
i=x;
j=y;
for(start=board[count];start <8;start++)
{
i+=HTry1[start];
j+=HTry2[start];
if(CanJump(i,j))
break;
i-=HTry1[start];
j-=HTry2[start];
}
//
依照次序,八个方向挨个试探是否可以走
if(start <8)
//此时8个方向重有一个可以走
{
board[count]=start;
//将马选择走的方向保存在数组board中
map[i][j]=++count+1;
//将马选择走到的点的map改为走的顺序
printf( "%d
%d
\n ",i,j);
//方便查看,打印走的点的坐标
Push(horse,i,j);
//将马选择走到的点压栈
x=i;
y=j;
}
else
//此时8个方向都无法走
{
map[i][j]=0;
//将当前无法继续走的点的map设置为0,表示没有走过,以后可以选择走
Pop(horse,&i,&j);
//将当前的马的位置出栈
i=horse-> x;
//
让i为无法继续走的位置的前一个位置的x
j=horse-> y;
//让j为无法继续走的位置的前一个位置的y
board[count]++;
//让反悔走的点的方向加1
}
}
}
void
PrintMap()
{
int
i,j;
for(i=0;i <N;i++)
{
for(j=0;i <N;i++)
printf( "%d
",map[i][j]);
printf( "\n ");
}
}
int
main()
{
int
x,y;
StackList
horse;
InitStack(&horse);
printf( "请输入起始位置(0-7): ");
scanf( "%d%d ",&x,&y);
HorseTravel(horse,x,y);
PrintMap();
getch();
return
0;
}