top1编程
← 返回题目
题解

八皇后问题

1 条题解

  • 0
    @ 2026-7-28 22:45:19
    #include<bits/stdc++.h>
    using namespace std;
    int cs=1, q[10][10]; // cs: 次数(计数),q: 棋盘(qi pan)
    bool lie[10], dui1[20], dui2[20]; // lie: 列,dui1: 对角线1,dui2: 对角线2
    
    // 检查(x行y列)是否可放皇后
    bool jc(int x, int y){ // jc: 检查(jian cha)
        return !lie[y] && !dui1[x+y] && !dui2[x-y+8];
    }
    
    // 深搜函数,step: 当前行数
    void dfs(int step){
        if(step == 9){ // 8行都放好皇后
            cout << "No. " << cs++ << '&#92;n';
            for(int i=1; i<=8; i++){ // 按列输出
                for(int j=1; j<=8; j++){
                    cout << q[j][i] << " ";
                }
                cout << '&#92;n';
            }
            return;
        }
        
        for(int l=1; l<=8; l++){ // l: 列(lie)
            if(jc(step, l)){
                q[step][l] = 1; // 放皇后
                lie[l] = dui1[step+l] = dui2[step-l+8] = true; // 标记占用
                dfs(step + 1); // 下一行
                lie[l] = dui1[step+l] = dui2[step-l+8] = false; // 回溯
                q[step][l] = 0; // 撤皇后
            }
        }
    }
    
    int main(){
        memset(lie, false, sizeof(lie));
        memset(dui1, false, sizeof(dui1));
        memset(dui2, false, sizeof(dui2));
        dfs(1); // 从第1行开始
        return 0;
    }
    
    • 1