#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#define M 8
#define N 8
#define maxsize 100
int mg[M+2][N+2]=
{
{1,1,1,1,1,1,1,1,1,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,1,0,0,0,1,0,1},
{1,0,0,0,0,1,1,0,0,1},
{1,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,1},
{1,0,1,0,0,0,1,0,0,1},
{1,0,1,1,1,0,1,1,0,1},
{1,1,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1}
};
typedef struct
{
int i; //当前方块的行号
int j; //当前方块的列号
int di; //di是下一可走相邻方位的方位号
} Box;
typedef struct
{
Box data[maxsize];
int top; //栈顶指针
}linknode; //定义栈类型
void push(linknode *&L,int i,int j){
L->top++;
L->data[L->top].i=i;
L->data[L->top].j=j;
L->data[L->top].di=-1;
}
bool mgpath(int i,int j,int ei,int ej){
linknode *p;
p=(linknode*)malloc(sizeof(linknode));
p->top=-1;
push(p,i,j);
mg[i][j]=-1;
while(p->top>-1){
int row,column,direct;
row=p->data[p->top].i;
column=p->data[p->top].j;
direct=p->data[p->top].di;
if(row==8&&column==8)
{
int k=0;
for(int i=0;i<=p->top;i++){
k++;
printf("(%d,%d )",p->data[i].i,p->data[i].j);
if(k % 5==0) printf("\n");
}
return true;
}
int find=0,row1,column1;
while(direct<4&&!find){
direct++;
switch(direct){
case 0:row1=row-1; column1=column; break;
case 1:column1=column+1; row1=row; break;
case 2:row1=row+1;column1=column; break;
case 3:column1=column-1; row1=row; break;
}
if(mg[row1][column1]==0) find=1;
}
//找到了下一个通路 入栈
if(find)
{
p->data[p->top].di=direct;
push(p,row1,column1);
mg[row1][column1]=-1;
}else{//未找到下一个通路 出栈,回溯
mg[row][column]=0;
p->top--;
}
}
return false;
}
int main(){
mgpath(1,1,M,N);
return 0;
}