题目描述
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。
如何将 8 个皇后放在棋盘上(有8 × 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。
对于某个满足要求的 8 皇后的摆放方法,定义一个皇后串 a
与之对应,
即 a = b1b2…b8,其中 bi 为相应摆法中第 i 行皇后所处的列数。
已经知道 8 皇后问题一共有 92 组解(即 92 个不同的皇后串)。
给出一个数 b
,要求输出第 b 个串。串的比较是这样的:皇后串 x 置于皇后串 y 之前,当且仅当将 x 视为整数时比 y 小。
输入格式
第 1 行是测试数据的组数 n,后面跟着 n 行输入。
每组测试数据占 1 行,包括一个正整数 b;
输出格式
输出有 n 行,每行输出对应一个输入,输出应是一个正整数,是对应于 b 的皇后串。
输入样例
2
1
92
输出样例
15863724
84136275
数据范围
1 ≤ b ≤ 92
题解
DFS:
#include <iostream>
using namespace std;
const int N = 100;
int n, cnt;
int g[N][N];
string ans[N];
bool col[N], dg[N], udg[N];
void dfs(int u)
{
if(u == 8)
{
string s;
for (int i = 0; i < 8; i ++)
for (int j = 0; j < 8; j ++)
if(g[i][j]) s += j + '1';
ans[++ cnt] = s;
return;
}
for (int i = 0; i < 8; i ++)
{
if(col[i] || dg[u + i] || udg[u - i + 8]) continue;
g[u][i] = 1;
col[i] = dg[u + i] = udg[u - i + 8] = true;
dfs(u + 1);
col[i] = dg[u + i] = udg[u - i + 8] = false;
g[u][i] = 0;
}
}
int main()
{
cin >> n;
dfs(0);
while(n --)
{
int x;
cin >> x;
cout << ans[x] << endl;
}
return 0;
}