问题描述:8*8的棋盘,刚开始让马在棋盘的任意一个位置上,让马踏日,(有八个方向),判断没踏过并且可踏,就踏,直到踏完所有的格子(cnt==64),调用print函数,然后cnt--,回溯法
输出,再回溯到上一个格子,一直到所有解输出完毕。
#include<stdio.h>
int m[8][8] = { 0 };
int cnt = 1;//用来累加是否踏完
int n = 1;//累加第几组解
//存储8个方向
int move[8][2] = {
{ 2,1 },
{ 1,2 },
{ -1,2 },
{ -2,1 },
{ -2,-1 },
{ -1,-2 },
{ 1,-2 },
{ 2,-1 }
};
void print()
{
int i, j;
printf("输出第%d组解:\n", n++);
for (i = 0; i < 8; i++)
{
for (j = 0; j < 8; j++)
printf("%5d ", m[i][j]);
printf("\n");
}
}
void Horse(int x, int y)
{
int a, b;
for (int i = 0; i < 8; i++)
{
a = x + move[i][0];
b = y + move[i][1];
//能踏并且没踏过
if (a >= 0 && a < 8 && b >= 0 && b < 8 && !m[a][b])
{
m[a][b] = ++cnt;
if (cnt < 64)
Horse(a, b);
else
print();
m[a][b] = 0;
cnt--;
}
}
}
int main()
{
m[0][0] = 1;
Horse(0, 0);
return 0;
}