哪位大神帮我解决下怎样才能避免重复走到相同的方块?下面运行的结果没有回溯。
#include<stdio.h>#define N 8
typedef struct
{
int i1;
int j1;
int di1;
}Box;
typedef struct
{
int top;
Box data[N*N];
}sqstack;
int Board[N][N]={0};
bool hourse(int Board[N][N],int x,int y)
{
int i,j,k=1,di, find;
sqstack st;
st.top=-1;
st.top++;
st.data[st.top].i1=x;//保存行号
st.data[st.top].j1=y;//保存列号
st.data[st.top].di1=-1;//保存所走的路径
Board[x][y]=k;
while(st.top>-1)//栈不为空时
{
i=st.data [st.top].i1;
j=st.data [st.top].j1;
di=st.data[st.top].di1;
find=0;
if(k==64)
return true;
while(di<7&&find==0)
{
di++;
switch(di)
{
case 0:i=st.data[st.top].i1-2;
j=st.data[st.top].j1-1;
if(i<0||i>=N||j<0||j>=N)
di++;
else break;
case 1:i=st.data[st.top].i1-2;
j=st.data[st.top].j1+1;
if(i<0||i>=N||j<0||j>=N)
di++;
else break;
case 2:i=st.data[st.top].i1-1;
j=st.data[st.top].j1+2;
if(i<0||i>=N||j<0||j>=N)
di++;
else break;
case 3:i=st.data[st.top].i1+1;
j=st.data[st.top].j1+2;
if(i<0||i>=N||j<0||j>=N)
di++;
else break;
case 4:i=st.data[st.top].i1+2;
j=st.data[st.top].j1+1;
if(i<0||i>=N||j<0||j>=N)
di++;
else break;
case 5:i=st.data[st.top].i1+2;
j=st.data[st.top].j1-1;
if(i<0||i>=N||j<0||j>=N)
di++;
else break;
case 6:i=st.data[st.top].i1+1;
j=st.data[st.top].j1-2;
if(i<0||i>=N||j<0||j>=N)
di++;
else break;
case 7:i=st.data[st.top].i1-1;
j=st.data[st.top].j1-2;
if(i<0||i>=N||j<0||j>=N)
di++;
else break;
}
if((Board[i][j])==0)find=1;//找到下一个可走的方块
}
if(find==1)
{
st.data[st.top].di1=di;
st.top++;
st.data[st.top].di1=-1;
st.data[st.top].i1=i;
st.data[st.top].j1=j;
k++;
Board[i][j]=k;
}
else
{
Board[st.data[st.top].i1][st.data[st.top].j1]=0;
k--;
st.top--;
}
}
return false;
}
void main()
{
int i,j,h,t;
bool flag;
printf("输入马踏遍开始的位置(0<i<%d,0<j<%d):\n",N,N);
scanf("%d %d",&i,&j);
flag=hourse(Board,i-1,j-1);
if(flag==false)
{
printf("马踏遍没有结果.\n");
}
else
{
printf("输出马踏过的结果:\n");
for(t=0;t<N;t++)
{
for(h=0;h<N;h++)
{
printf("%d\t",Board[t][h]);
}
printf("\n");
}
}
}