回溯法——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;
}
相关推荐
leiming634 分钟前
C++ vector容器
开发语言·c++·算法
Xの哲學2 小时前
Linux流量控制: 内核队列的深度剖析
linux·服务器·算法·架构·边缘计算
yaoh.wang2 小时前
力扣(LeetCode) 88: 合并两个有序数组 - 解法思路
python·程序人生·算法·leetcode·面试·职场和发展·双指针
LYFlied3 小时前
【每日算法】 LeetCode 56. 合并区间
前端·算法·leetcode·面试·职场和发展
艾醒3 小时前
大模型原理剖析——多头潜在注意力 (MLA) 详解
算法
艾醒3 小时前
大模型原理剖析——DeepSeek-V3深度解析:671B参数MoE大模型的技术突破与实践
算法
jifengzhiling4 小时前
零极点对消:原理、作用与风险
人工智能·算法
鲨莎分不晴5 小时前
【前沿技术】Offline RL 全解:当强化学习失去“试错”的权利
人工智能·算法·机器学习
XFF不秃头5 小时前
力扣刷题笔记-全排列
c++·笔记·算法·leetcode