typedef struct{
int i; //當前方位的行號
int j; //當前方位的列號
int di; //下一可走相鄰方位的方位號
} Box; //存儲方塊
typedef struct{
Box data[MaxSize];
int top; //棧頂指針
} StType; //存儲路徑
bool mgpath(int xi,int yi,int xe,int ye){
int i,j,k,di,find;
StType st;
st.top=-1;
st.top++;
st.data[st.top].i=xi;
st.data[st.top].j=yi;
st.data[st.top].di=-1;
mg[xi][yi]=-1;
while(st.top>-1){ //棧不空時循環
i=st.data[st.top].i;
j=st.data[st.top].j;
di=st.data[st.top].di;
if(i=xe&&j=ye){ //找到了出口,輸出路徑
printf("路徑如下:\n");
for(k=0;k<st.top;k++){
printf("\t [%d, %d]",st.data[k].i,st.data[k].j);
if((k+1)%5==0){
printf("\n");
}
}
printf("\n");
return true
}
find=0;
while(di<4&&find==0){ //尋徑
di++;
switch(di){
case 0:i=st.data[st.top].i-1; //di爲0 向左走一格
j=st.data[st.top].j;
break;
case 1:i=st.data[st.top].i; //di爲1 向上走一格
j=st.data[st.top].j+1;
break;
case 2:i=st.data[st.top].i+1; //di爲2 向右走一格
j=st.data[st.top].j;
break;
case 3:i=st.data[st.top].i; //di爲3 向下走一格
j=st.data[st.top].j-1;
break;
}
if(mg[i][j]==0){
find=1; //找到一個可走的方塊【i,j】
}
}
if(find==1){
st.data[st.top].di=di; //修改原棧頂元素的方向值
st.top++; //下一個可走方塊進棧
st.data[st.top].i=i;
st.data[st.top].j=j;
st.data[st.top].di=-1; //下一個可走方塊的di值置爲-1
mg[i][j]=-1; //避免重複走到此方塊
}
else{
mg[st.data[st.top].i][st.data[st.top].j]==0;//將該位置變成其他位置可走方塊,而不是置爲-1
st.top--; //退棧
}
}
return false; //表示沒有可走路徑,返回false
}