回溯法——LQ_04 2n皇后

(原题来自蓝桥杯训练题)给定一个nxn的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?

输入格式:

输入的第一行为一个整数n,1<n<9,表示棋盘的大小。接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。

输出格式:

输出一个整数,表示总共有多少种放法。

输入样例1:

在这里给出一组输入。例如:

cpp 复制代码
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

输出样例1:

在这里给出相应的输出。例如:

复制代码
2

输入样例2:

在这里给出一组输入。例如:

cpp 复制代码
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1

输出样例2:

在这里给出相应的输出。例如:

复制代码
0
cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=10;
int mp[N][N];
bool vy[N],vd[2*N],uvd[2*N];//这里用来给黑皇后做标记,列,正对角线,反对角线
bool vis[N][N];//这里给放过黑皇后的地方做标记,放过了黑皇后以后,白皇后就不能放在这个位置了
bool vy1[N],vd1[2*N],uvd1[2*N];//这里用来给黑皇后做标记,列,正对角线,反对角线
int n;
int ans;//答案
//放入白皇后函数
void dfs_w(int a)
{
    if(a==n)
    {//白皇后到最后一行的下一行时,答案++;
        ans++;
        return;
    }
    for(int i=0;i<n;i++)
    {
        if(mp[a][i]!=0 && !vy1[i] && !vd1[a+i] && !uvd1[i-a+n] && !vis[a][i]){
            vis[a][i]=true;
            vy1[i]=vd1[a+i]=uvd1[i-a+n]=1;
            dfs_w(a+1);
            vy1[i]=vd1[a+i]=uvd1[i-a+n]=0;
            vis[a][i]=false;
        } 
    }
}
//放入黑皇后函数
void dfs_b(int x)//x表示第几行
{
    if(x==n)
    {//黑皇后放完了,那么开始从第一行放白皇后
        dfs_w(0);
        return;
    }
    for(int i=0;i<n;i++)//i表示第几列
    {
        if(mp[x][i]!=0 && !vy[i] && !vd[x+i] && !uvd[i-x+n]){//判断当前位置不能为0,当前列,对角线,反对角线没有被放过
            vis[x][i]=true;//给当前位置放入黑皇后
            vy[i]=vd[x+i]=uvd[i-x+n]=1;//标记
            dfs_b(x+1);
            vy[i]=vd[x+i]=uvd[i-x+n]=0;//移除标记
            vis[x][i]=false;//移除黑皇后
        } 
    }
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>mp[i][j];
        }
    }
    dfs_b(0);
    cout<<ans<<endl;
    return 0;
}
相关推荐
TheLegendMe38 分钟前
贪心+线程安全单例
算法·哈希算法
豐儀麟阁贵1 小时前
8.5在方法中抛出异常
java·开发语言·前端·算法
胖咕噜的稞达鸭1 小时前
算法入门:滑动窗口--->找到字符串中所有的字母异位词,串联所有的子串,最小覆盖子串
数据库·redis·算法
小青龙emmm2 小时前
2025级C语言第二次周测(国教专用)题解
c语言·开发语言·算法
WolfGang0073212 小时前
代码随想录算法训练营Day28 | 509.斐波那契数列、70.爬楼梯、746.使用最小花费爬楼梯
算法
Boop_wu2 小时前
[Java EE] 多线程进阶(JUC)(2)
java·jvm·算法
闻缺陷则喜何志丹3 小时前
【SOSDP模板 容斥原理 逆向思考】3757. 有效子序列的数量|分数未知
c++·算法·力扣·容斥原理·sosdp·逆向思考
CoovallyAIHub3 小时前
如何在手机上轻松识别多种鸟类?我们发现了更简单的秘密……
深度学习·算法·计算机视觉
第二只羽毛3 小时前
遵守robots协议的友好爬虫
大数据·爬虫·python·算法·网络爬虫
艾斯比的日常3 小时前
Java 三色标记算法:并发垃圾回收的核心技术解析
java·开发语言·算法