文章

10

粉丝

40

获赞

2

访问

4.9k

头像
DFS:

从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;
        }
...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发