【蓝桥杯】试题 基础练习 2n皇后问题c++实现

题目如下

基本思路:

对于每一行中的每个位置,尝试放置黑皇后:

如果不能放下,则尝试这一行的下一个位置;

如果能放下,尝试放置白皇后:

如果不能放下,则尝试这一行的下一个位置;

如果能放下,开始放下一层的皇后;

代码实现:

#include<bits/stdc++.h>
using namespace std;

int n;//棋盘规模

int main(){
    cin >> n;//输入棋盘规模
    initPlace(n);//输入棋盘
    dfs(1);//尝试第一层
    cout << res;//输出
    return 0;
}

其中:

initPlace()输入棋盘:

char place[8+1][8+1];//棋盘

void initPlace(int i){
    for (int j = 0; j < i; ++j) {
        for (int k = 0; k < i; ++k) {
            cin >> temp;
            //可放置记录为.
            if(temp) place[j+1][k+1] = '.';
            //不可放置记录为0
            else if(!temp) place[j+1][k+1] = '0';
        }
    }
}

dfs()尝试每一层

//列[列序数],对角线[列序数+行序数],反对角线[列序数-行序数+n]
//值为1则可放置,为0不可放置

vector<int> lH(8+1,1),xH(2*8+1,1),fxH(2*8+1,1);
//黑皇后的列,对角线和反对角线

vector<int> lB(8+1,1),xB(2*8+1,1),fxB(2*8+1,1);
//白皇后的列,对角线和反对角线


void dfs(int i){

    if (i == (n+1)) {
    //如果进入了第n+1层,说明前面的放好了
        res++;
        //这里可用代码查看当前棋盘
        return;
    }
    for (int j = 0; j < n; ++j) {
    //遍历当前行,尝试放置黑皇后
        if((place[i][j+1] == '.') 
            && lH[j+1] 
            && xH[i+j+1] 
            && fxH[j+1-i+n]){
            //棋盘可放置并且列、对角线、反对角线允许

            place[i][j+1]='H';
            //放下棋子,标记为黑皇后(方便查看)
            lH[j+1]=xH[i+j+1]=fxH[j+1-i+n]=0;
            //列、对角线、反对角线不允许了


            for (int k = 0; k < n; ++k) {
            //遍历当前行,尝试放置白皇后
                if((place[i][k + 1] == '.'
                    && lB[k+1] 
                    && xB[i+ k+ 1] 
                    && fxB[k+1-i+n]){
                    //棋盘可放置并且列、对角线、反对角线允许

                    place[i][k + 1] = 'B';
                    //标记为白皇后
                    lB[k + 1]= xB[i + k + 1]= fxB[k + 1 - i + n]=0;
                    //列、对角线、反对角线不允许了

                    dfs(i+1);
                    //进入下一层

                    place[i][k + 1] = '.';
                    //拿走白皇后,尝试下一个位置
                    lB[k + 1]= xB[i + k + 1]= fxB[k + 1 - i + n]=1;
                    //允许现在的列、对角线、反对角线
                }
            }


            place[i][j+1]='.';
            //拿走黑皇后,尝试下一个位置
            lH[j+1]=xH[i+j+1]=fxH[j+1-i+n]=1;
            //允许现在的列、对角线、反对角线
        }
    }
}

如果要查看结果

outPlace()输出棋盘

void outPlace(){
    //将该函数置于上一个代码块的第14行即可
    cout << "-----------" << endl;
    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < n; ++j) {
            cout << place[i+1][j+1];
        }
        cout << endl;
    }
    cout << endl;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据给定的问题描述和代码,这是一个关于蓝桥杯C++题目中的n皇后问题。题目要求在一个n*n的棋盘上放置n个黑皇后和n个白皇后,使得任意两个黑皇后和任意两个白皇后都不在同一行、同一列或同一条对角线上。代码使用递归和回溯的方法来解决这个问题。 代码中的pd1函数用于判断黑皇后的位置是否合法,pd2函数用于判断白皇后的位置是否合法。fang1函数用于放置黑皇后,fang2函数用于放置白皇后。最后,通过调用fang1函数来计算总共有多少种放法。 需要注意的是,代码中使用的p1和p2数组分别表示黑皇后和白皇后的位置,qi数组表示棋盘上每个位置是否可以放皇后。 因此,根据给定的代码,可以计算出总共有多少种放法。 #### 引用[.reference_title] - *1* [蓝桥杯 基础练习 2n皇后问题C/C++(可作DFS练习)](https://blog.csdn.net/qq_43838669/article/details/129306490)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [蓝桥杯2n皇后问题](https://blog.csdn.net/qq_59611494/article/details/128682794)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值