• 蓝桥杯 2n皇后问题 深搜


    默认大家会了n皇后问题

    基础练习 2n皇后问题  
    时间限制:1.0s   内存限制:512.0MB
       
    问题描述
      给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
    输入格式
      输入的第一行为一个整数n,表示棋盘的大小。
      接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
    输出格式
      输出一个整数,表示总共有多少种放法。
    样例输入
    4
    1 1 1 1
    1 1 1 1
    1 1 1 1
    1 1 1 1
    样例输出
    2
    样例输入
    4
    1 0 1 1
    1 1 1 1
    1 1 1 1
    1 1 1 1
    样例输出
    0

    思路:将N皇后问题扩展成2N皇后问题,一维循环变成二维即可。

    #include<iostream>
    using namespace std;
    const int N = 10;
    int a[N][N];
    int n;
    int ans;
    bool colb[N],dlb[N],udlb[N],colh[N],dlh[N],udlh[N];
    void dfs(int u)
    {
        if(u==n){
            ans++;
            return ;
        }
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                if(i!=j){
                    if(!colb[i]&&!dlb[i+u]&&!udlb[n-i+u]&&!colh[j]&&!dlh[j+u]&&!udlh[n-j+u]&&a[u][i]==1&&a[u][j]==1){
                        colb[i]=dlb[i+u]=udlb[n-i+u]=colh[j]=dlh[j+u]=udlh[n-j+u]=true;
                        dfs(u+1);
                        colb[i]=dlb[i+u]=udlb[n-i+u]=colh[j]=dlh[j+u]=udlh[n-j+u]=false;
                    }
                }
            }
        }
    }
    int main()
    {
        cin>>n;
        for(int i=0;i<n;++i){
            for(int j=0;j<n;++j){
                cin>>a[i][j];
            }
        }
        dfs(0);
        cout<<ans<<endl;
        return 0;
    }
    
  • 相关阅读:
    jsp页面间传递参数 中文乱码问题(zz)
    java 生成xml
    java dom4j 解析xml
    生成不重复的32为随机码
    [HYSBZ
    七夕祭
    [CF741D] Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
    Baltic2014 sequence
    [洛谷P2459] SDOI2011 消耗战
    [洛谷P4172] WC2006 水管局长
  • 原文地址:https://www.cnblogs.com/clear-love/p/11290497.html
Copyright © 2020-2023  润新知