📅  最后修改于: 2023-12-03 14:49:31.177000             🧑  作者: Mango
在一个 N * N 大小的棋盘上,放置 k 个不互相攻击的车的位置有多少种方案,其中 k <= N。本文将介绍一种以字典顺序查找可以放置非攻击车的位置的方法。
本算法的最差情况是递归到底层时每一行都要遍历完整个棋盘,因此时间复杂度为 O(N^N)。
void solve(int row, int n, vector<int>& state, vector<vector<string>>& res) {
if (row == n) {
vector<string> ans(n, string(n, '.'));
for (int i = 0; i < n; i++) {
ans[i][state[i]] = 'Q';
}
res.push_back(ans);
return;
}
for (int col = 0; col < n; col++) {
bool flag = true;
for (int k = 0; k < row; k++) {
if (state[k] == col || abs(row - k) == abs(col - state[k])) {
flag = false;
break;
}
}
if (flag) {
state[row] = col;
solve(row + 1, n, state, res);
state[row] = -1;
}
}
}
vector<vector<string>> solveNQueens(int n) {
vector<vector<string>> res;
vector<int> state(n, -1);
solve(0, n, state, res);
return res;
}
本文介绍了一种以字典顺序查找可以放置非攻击车的位置的方法,该方法时间复杂度为 O(N^N)。通过对状态的定义以及基于“能否合法放置”进行筛选的过程,可以降低部分不必要的搜索,提高程序效率。