01DFS

阅读 18

2022-02-02

排列数字

#include <iostream>

using namespace std;

const int N = 10;

int n;
int path[N];
bool st[N];

void dfs(int cur) {
    if (cur == n) {
        for (int i = 0; i < n; i ++ ) printf("%d ", path[i]);
        printf("\n");
        return;
    }
    for (int i = 1; i <= n; i ++ ) {
        if (!st[i]) {
            path[cur] = i;
            st[i] = true;
            dfs(cur + 1);
            st[i] = false;
        }
    }
}

int main() {
    cin >> n;
    dfs(0);
    return 0;
}

n-皇后问题

#include <iostream>

using namespace std;

const int N = 20;

int n;
char g[N][N];
bool col[N], dg[N], udg[N]; // col[i]表示第i列,dg[i]表示第i个对角线"\",udg[i]表示第i个反对角线"/"

void dfs(int u)
{
    if (u == n)
    {
        for (int i = 0; i < n; i ++ ) puts(g[i]);
        puts("");
        return;
    }

    for (int i = 0; i < n; i ++ )
        if (!col[i] && !dg[u + i] && !udg[n - u + i]) // u表行,i表列,根据行列可得到这是在第几个对角线上
        {
            g[u][i] = 'Q';
            col[i] = dg[u + i] = udg[n - u + i] = true;
            dfs(u + 1);
            col[i] = dg[u + i] = udg[n - u + i] = false;
            g[u][i] = '.';
        }
}

int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++ )
        for (int j = 0; j < n; j ++ )
            g[i][j] = '.';

    dfs(0);
}

精彩评论(0)

0 0 举报