#include <iostream>
using namespace std;

const int MAXN = 10;

int n;
int a[MAXN]; // 存放皇后的列号

bool check(int row, int col) {
    for (int i = 0; i < row; i++) {
        // 检查是否和之前的皇后在同一列或者在同一对角线
        if (a[i] == col || abs(row - i) == abs(col - a[i])) {
            return false;
        }
    }
    return true;
}

void dfs(int row) {
    if (row == n) {
        // 找到一个解
        for (int i = 0; i < n; i++) {
            cout << setw(5) << a[i];
        }
        cout << endl;
        return;
    }
    for (int col = 0; col < n; col++) {
        if (check(row, col)) {
            a[row] = col; // 在第row行的col列放置皇后
            dfs(row + 1);
        }
    }
}

int main() {
    cin >> n;
    dfs(0);
    return 0;
}
``
【搜索回溯】n 皇后问题描述在一个n×n国际象棋盘上有n个皇后每个皇后占一格;要求皇后间不会出现相互攻击的现象即不能有两个皇后处在同一行、同一列或同一对角线上。问共有多少种不同的方法。说明:本题的解空间有两种做法:1、用二维数组存放。这种方法虽然直观好理解但是程序实现稍微麻烦一点。比如aij0表示不放1表示放皇后用二维数组aij=1皇后的放置位置信息有两个:对应的行信息i 对应的列信息 j所以我们

原文地址: https://www.cveoy.top/t/topic/hRUR 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录