#include"stdio.h"
#include"stdlib.h"
#define TRUE 1
#define FALSE 0
#define NULL 0
typedef struct
{
int i; // 当前棋盘的坐标位置
int j;
int level; // 当前试探的方向,下次将不再试探这个方向了
}SDataType;
typedef struct SNodeType
{
SDataType data;
SNodeType *next;
}SStack;
void InitStack(SStack *st);
int push(SStack *st,SDataType x);//压入元素
SNodeType *ptop(SStack *st);//取栈顶元素并弹出删除
int empty(SStack *st);//判断栈是否空
void print_map();
int map[8][8];
void main(){
SStack *head;//堆栈
SDataType *datap;
int count=0;
int i,j;
int m,n;
int level;
for(int k=0;k<8;k++) //棋盘初始化
for(int l=0;l<8;l++)
//*(*(map+k)+l)=0;
map[k][l]=0;
datap=(SDataType *)malloc(sizeof(SDataType)); //准备初始数据开始入栈,进入递归
datap->i=i=0;
datap->j=j=0;
datap->level=level=0;
InitStack(head);
push(head,*datap);
into: //递归入口
datap->i=i; //保存当前状态
datap->j=j;
switch(level){//选择递归入口
case 1:goto lev2;
case 2:goto lev3;
case 3:goto lev4;
case 4:goto lev5;
case 5:goto lev6;
case 6:goto lev7;
case 7:goto lev8;
case 8:goto exit;
};
lev1://递归入口1
m=i+1;n=j-2; //位置前进,但不覆当前位置
if(m>=0&&m<8&&n>=0&&n<8)//判断前进后的位置是否再棋盘里
if(map[m][n]==0){ //如果这个位置在棋盘里,判断是否位置为空
count++; //位置为空了,计数器加
map[i][j]=count; //棋盘置当前步数
datap->level=1; //设置当前入口号
push(head,*datap); //数据压入堆栈
i=m; //位置下移
j=n;
level=0; //上面的步奏已经完成了递归到下一层的准备工作
goto into; //进入到下一层
};
lev2:
m=i+2;n=j-1; // 2
if(m>=0&&m<8&&n>=0&&n<8)
if(map[m][n]==0){
count++; //计数器
map[i][j]=count; //棋盘置当前步数
datap->level=2;
push(head,*datap);
i=m; //位置下移
j=n;
level=0;
goto into;
};
lev3:
m=i+2;n=j+1; // 3
if(m>=0&&m<8&&n>=0&&n<8)
if(map[m][n]==0){
count++; //计数器
map[i][j]=count; //棋盘置当前步数
datap->level=3;
push(head,*datap);
i=m; //位置下移
j=n;
level=0;
goto into;
};
lev4:
m=i+1;n=j+2; // 4
if(m>=0&&m<8&&n>=0&&n<8)
if(map[m][n]==0){
count++; //计数器
map[i][j]=count; //棋盘置当前步数
datap->level=4;
push(head,*datap);
i=m; //位置下移
j=n;
level=0;
goto into;
};
lev5:
m=i-1;n=j+2; // 5
if(m>=0&&m<8&&n>=0&&n<8)
if(map[m][n]==0){
count++; //计数器
map[i][j]=count; //棋盘置当前步数
datap->level=5;
push(head,*datap);
i=m; //位置下移
j=n;
level=0;
goto into;
};
lev6:
m=i-2;n=j+1; // 6
if(m>=0&&m<8&&n>=0&&n<8)
if(map[m][n]==0){
count++; //计数器
map[i][j]=count; //棋盘置当前步数
datap->level=6;
push(head,*datap);
i=m; //位置下移
j=n;
level=0;
goto into;
};
lev7:
m=i-2;n=j-1; // 7
if(m>=0&&m<8&&n>=0&&n<8)
if(map[m][n]==0){
count++; //计数器
map[i][j]=count; //棋盘置当前步数
datap->level=7;
push(head,*datap);
i=m; //位置下移
j=n;
level=0;
goto into;
};
lev8:
m=i-1;n=j-2; // 8
if(m>=0&&m<8&&n>=0&&n<8)
if(map[m][n]==0){
count++; //计数器
map[i][j]=count; //棋盘置当前步数
datap->level=8;
push(head,*datap);
i=m; //位置下移
j=n;
level=0;
goto into;
};
exit://回退过程
if(!empty(head)){//判断是否堆栈为空了,为空说明递归过程结束
if(count==63){//用于判断是否已经求出一种解法
//countnum=countnum+1;
map[i][j]=64;
print_map(); //如果遍厉棋盘则打印一次走法
//map[i][j]=0;
};
count--; // 计数器减
map[i][j]=0;// 回退 置零
*datap=ptop(head)->data;//从堆栈里恢复数据
i=datap->i;
j=datap->j;
level=datap->level;//恢复上一个试探过的方向
goto into;
};
getchar();
}
void print_map(){//打印输出整个走法
for(int i=0;i<8;i++){
for(int j=0;j<8;j++)
printf("%3d",*(*(map+i)+j));
printf("\n");
}
}
void InitStack(SStack *st)
{
st=NULL;
}
int push(SStack *st,SDataType x)
{
SStack *p;
p=(SStack *)malloc(sizeof(SNodeType));
p->data=x;
p->next=st;
st=p;
return TRUE;
}
SNodeType *ptop(SStack *st)
{
SNodeType *p;
if(st==NULL) printf("The Stack Is NULL!\n");
p=st;
st=st->next;
return p;
}
int empty(SStack *st)
{
if(st==NULL) return TRUE;
else
return FALSE;
}
编译是通过了,但是运行的时候出现“XXX.exe应用程序错误”
各位大虾高手可否指点迷津,在此先谢过了。