//此解法的重点在于,通过一个变量取余使得具有相同路数的可能走另一条路,优先级变化。
#include <stdio.h>
#define INF 100
int board[8][8];
int start;
int mover[] = {-2, -1, 1, 2, 2, 1, -1, -2};
int movec[] = { 1, 2, 2, 1,-1,-2, -2, -1};
int numable(int r, int c, int nexta[])
{
/*返回下次可以找到的增量*/
int i, k, a, b;
int num = 0;
for(i = 0;i <= 7;i++)
{
k = (i + start) % 8; //让具有相同值的可以换一个位置优先
a = r + mover[k];
b = c + movec[k];
if(a <= 7 && a >= 0 && b >= 0 && b <= 7 && board[a][b] == 0)
{
nexta[num] = k;
num++;
}
}
return num;
}
int number(int r, int c)
{
/*返回下次可以找到的增量的个数*/
int i, k, a, b;
int num = 0;
for(i = 0;i <= 7;i++)
{
k = (i + start) % 8;
a = r + mover[k];
b = c + movec[k];
if(a <= 7 && a >= 0 && b >= 0 && b <= 7 && board[a][b] == 0)
{
num++;
}
}
return num;
}
int next(int r, int c)
{
/*返回下次要找的增量,若是-1没有可以找的位置*/
int nexta[8], num, num1 = 0, minNum, i, k;
minNum = INF;
num = numable(r, c, nexta);
if(num == 0)
{
return -1; //没有出口
}
for(i = 0;i <= num - 1;i++)
{
num1 = number(r + mover[nexta[i]], c + movec[nexta[i]]);
if(num1 <= minNum)
{
minNum = num1;
k = nexta[i];
}
}
return k;
}
int main(int argc, char* argv[])
{
int ber, bec;
int step, caseCounter;
int r, c;
int i, j, k;
printf("Please input the first node:(x y)\n");
while(scanf("%d%d", &ber, &bec) != EOF)//接收起点
{
start = 0;
caseCounter = 1;
while(start <= 7)
{
//初始化
for(i = 0;i <= 7;i++)
for(j = 0;j <= 7;j++)
board[i][j] = 0;
r = ber;
c = bec;
board[r][c] = 1;//起点
step = 2;//下一个位置
while(1)
{
if(step > 64)
{
printf("Case %d:\n", caseCounter++);
for(i = 0;i <= 7;i++)
{
for(j = 0;j <= 7;j++)
{
printf("%2d ", board[i][j]);
}
printf("\n");
}
start++;
break;
}//end if
k = next(r, c);
if(k == -1)
{
start++;
break;
}
r = r + mover[k];
c = c + movec[k];
board[r][c] = step;
step++;
}//end while(1)
}//end while(start <= 7)
}//end while(scanf("%d%d", &ber, &bec) != EOF)
return 0;
}