文章
10
粉丝
22
获赞
2
访问
4.3k
从y总的算法基础课来的,这道题相当于y总课上讲的板子题的拓展(排列数字和n皇后问题),我的思路是用数组q[N]存皇后在哪一行的哪一列,再按照下标从小到大的顺序取出完整结果对应的整数的高位到低位,再存到一个数组res[N]中,接着用sort对res排序(c++中sort默认是从小到大,符合此题题意),最后输入b,再输出排序后的res[b - 1],即为正确答案。
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 20;
int n;
int b;
int q[N];
int res[100]; // 假设最多有100个解
bool col[N], dp[2 * N], udp[2 * N];
int cnt = 0;
int convert(int digits[], int size)
{
int number = 0;
for (int i = 0; i < size; ++i) {
number = number * 10 + digits[i];
}
return number;
}
void dfs(int u)
{
if (u == n)
{
res[cnt++] = convert(q, n);
return;
}
for (int i = 0; i < n; i++)
{
if (!col[i] && !dp[u - i + n] && !udp[u + i])
{
q[u] = i + 1; // 列号从1开始
col[i] = dp[u - i + n] = udp[u + i] = true;
dfs(u + 1);
col[i] = dp[u - i + n] = udp[u + i] = false;
}
...
登录后发布评论
暂无评论,来抢沙发