回溯法——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;
}
相关推荐
凌波粒20 分钟前
LeetCode--108.将有序数组转换为二叉搜索树(二叉树)
算法·leetcode·职场和发展
liulilittle21 分钟前
KCC:在 BBR 思路上的一次探索
网络·tcp/ip·算法·bbr·通信·拥塞控制·kcc
浦信仿真大讲堂42 分钟前
达索系统SIMULIA Abaqus 2026接触和约束的增强新功能介绍
人工智能·python·算法·仿真软件·达索软件
点云侠1 小时前
PCL 生成三棱锥点云
c++·算法·最小二乘法
兰令水1 小时前
leecodecode【面试150】【2026.6.13打卡-java版本】
java·算法·leetcode
临沂堇1 小时前
刷题日志 | Leetcode Hot 100 哈希
算法·leetcode·哈希算法
玉小格2 小时前
一次关于Python的总结
算法
伊甸32 小时前
从企业级项目学敏感词过滤:DFA算法与双层缓存实战
java·算法·缓存
bIo7lyA8v2 小时前
算法中的随机化思想及其复杂度收益评估的技术8
算法
数据法师2 小时前
视频文件重复检测工具:基于哈希与视频指纹的三级筛选机制
算法·音视频·哈希算法