zoukankan      html  css  js  c++  java
  • [蓝桥杯][基础练习VIP]2n皇后问题

    时间限制: 1Sec 内存限制: 128MB 提交: 26 解决: 18

    题目描述
    给定一个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

        2018/3/29 16:8
        首先理解八皇后,然后就是一个使用两个八皇后叠加的问题,通过多设置几个数组就可以实现2*n皇后的问题,注意定义数组记录是否访问这一行或者这一列的时候,数组的值要大一些,防止数组越界。

        然后就是一个最基本的DFS就可以了。

    #include<cstdio>
    #include<cstring>
    int a[9][9],vis1[9],vis2[9],cnt,n;
    int x1[19],x2[19],y1[19],y2[19];
    void dfs(int dep)
    {
        if(dep==n+1) { cnt++; return ;}
        for(int i=1;i<=n;i++)
        {
            if(!vis1[i] && a[dep][i] && !x1[dep+i] && !y1[dep-i+n])
            {
                vis1[i]=1; a[dep][i]=0; x1[dep+i]=1; y1[dep-i+n]=1;
                for(int j=1;j<=n;j++)
                {
                    if(!vis2[j] && a[dep][j] && !x2[dep+j] && !y2[dep-j+n])
                    {
                        vis2[j]=1;a[dep][j]=0; x2[dep+j]=1; y2[dep-j+n]=1;
                        dfs(dep+1);
                        vis2[j]=0;a[dep][j]=1; x2[dep+j]=0; y2[dep-j+n]=0;
                    }
                }
                vis1[i]=0; a[dep][i]=1; x1[dep+i]=0; y1[dep-i+n]=0;
            }
        }
    }
    int main(void)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&a[i][j]);
        dfs(1);
        printf("%d",cnt);
        return 0;
    }
  • 相关阅读:
    iOS- 移动端Socket UDP协议广播机制的实现
    iOS- 三步快速集成社交化分享工具ShareSDK
    iOS- iOS 7 的后台多任务 (Multitasking) 对比之前的异同、具体机制、变化
    iOS- Exception异常处理
    17. Subsets【medium】
    zookeeper程序员指南
    error while loading shared libraries错误解决
    82. Single Number【easy】
    53. Reverse Words in a String【easy】
    查看linux内核和版本信息
  • 原文地址:https://www.cnblogs.com/zuimeiyujianni/p/8670571.html
Copyright © 2011-2022 走看看