题目描述
输入 n ( 1< = n < = 10 ) 代表棋盘的规模就是 n*n 的规模,骑士永远从 (1,1) 出发,要求骑士走遍所有棋盘的格子
输出 骑士的走法(遍历棋盘的所有格子)
注意方向:
constintdx[8]={ -2,-2, -1, 1,2, 2, 1,-1};
constintdy[8]={ -1, 1, 2, 2,1,-1,-2,-2};
输入
输入 n ( 1< = n < = 10 ) 代表棋盘的规模就是 n*n 的规模,骑士永远从 (1,1) 出发,要求骑士走遍所有棋盘的格子
输出 骑士的走法(遍历棋盘的所有格子)
输出
只有唯一解
样例输入
5
样例输出
代码实现
#include<bits/stdc++.h>
using namespace std;
int n;
int a[20][20];
int dx[8] = {-2,-2,-1,1,2,2,1,-1};
int dy[8] = {-1,1,2,2,1,-1,-2,-2};
int flag = 0;
void dfs(int x,int y,int num)
{
int x1,y1;
if(num == n*n) //递归出口条件
{
flag = 1;
return;
}
for(int i = 0; i < 8; ++i)
{
x1 = x + dx[i];
y1 = y + dy[i];
if(x1>0&&x1<=n&&y1>0&&y1<=n&&!a[x1][y1])
{
num = num+1;
a[x1][y1] = num;
dfs(x1,y1,num);
num = num-1; //回溯,要将原来的恢复
if(flag)
return;
a[x1][y1] = 0;
}
x1 = x - dx[i];
y1 = y - dy[i];
}
}
int main()
{
cin >> n;
a[1][1] = 1;
dfs(1,1,1);
for(int i = 1; i <= n; ++i)
{
for(int j = 1; j <= n; ++j)
{
cout << a[i][j];
if(j < n)
cout << " ";
}
cout << endl;
}
return 0;
}
思考
意如果此解不能走完全部的点,回溯时要一步步恢复原样,继续寻找该唯一解