C语言算法题(马的遍历问题),请教高手!
马的遍历问题。在8x8方格的棋盘上从任意指定的位置出发,为马寻找一条走遍棋盘每一格并且只经过一次的路径),我想不用贪婪法而是用普通的回溯法做一下,但是程序却总是说走不通,我认为逻辑上应该没有错,实在是搞不懂,请高手帮忙看一下:
#include <stdio.h>
#include <malloc.h>
#define N 8
#define MAX N * N
typedef struct tagSTACK
{
int i, j;
struct tagSTACK * next;
}STACK;//用来回溯的栈数组的元素结构,i、j为当前这一步,而将下一步的可能走法链接在后面
void print(STACK stk[], int top)
{
int i;
for (i = 0; i < top; i++)
printf ("第%2d步, 走到(i = %d, j = %d)\n", i + 1,
stk[i].i, stk[i].j);
}
void setStk(STACK stk[], int top, int i, int j)
{//将当前所在位置的下一步链接到栈中
STACK * p = (STACK *) malloc (sizeof (STACK));
p->i = i;
p->j = j;
p->next = stk[top].next;
stk[top].next = p;
}
int running(int pace[][N], int i, int j)
{
int top = 0;
STACK stk[MAX], * p;
while (top < N * N - 1)
{
stk[top].i = i;
stk[top].j = j;
stk[top].next = NULL;
if (i + 2 < N && j + 1 < N && !pace[i + 2][j + 1])
setStk (stk, top, i + 2, j + 1);
if (i + 1 < N && j + 2 < N && !pace[i + 1][j + 2])
setStk (stk, top, i + 1, j + 2);
if (i - 1 >= 0 && j + 2 < N && !pace[i - 1][j + 2])
setStk (stk, top, i - 1, j + 2);
if (i - 2 >= 0 && j + 1 < N && !pace[i - 2][j + 1])
setStk (stk, top, i - 2, j + 1);
if (i - 2 >= 0 && j - 1 >= 0 && !pace[i - 2][j - 1])
setStk (stk, top, i - 2, j - 1);
if (i - 1 >= 0 && j - 2 >= 0 && !pace[i - 1][j - 2])
setStk (stk, top, i - 1, j - 2);
if (i + 1 < N && j - 2 >= 0 && !pace[i + 1][j - 2])
setStk (stk, top, i + 1, j - 2);
if (i + 2 < N && j - 1 >= 0 && !pace[i + 2][j - 1])
setStk (stk, top, i + 2, j - 1);
if (stk[top].next == NULL)//从这一步走不下去了,需要回溯
{
do
{
pace[stk[top].i][stk[top].j] = 0;//还原状态
--top;
}while (top >= 0 && stk[top].next == NULL);
if (top < 0) return 0;
}
else
pace[i][j] = 1;
p = stk[top].next;
i = p->i;
j = p->j;
stk[top].next = p->next;//把下面要走的这一步从上一步的链表中删除
free (p);
top++;
}
print (stk, top);
return 1;
}
void main()
{
int pace[N][N], i, j;
for (i = 0; i < N; i++)
for (j = 0; j < N; j++)
pace[i][j] = 0;//初始化状态
INPUT:
printf("请指定从哪一格开始(i,j):");
scanf ("%d,%d", &i, &j);
if (i >= N || j >= N) goto INPUT;
if(!running (pace, i, j))
printf ("从您指定的这一格无法不重复地走遍整个棋盘\n");
}