zoukankan      html  css  js  c++  java
  • BZOJ 4809: 皇后 搜索

    4809: 皇后

    Description

    众所不知,rly现在不会玩国际象棋。但是,作为一个OIer,rly当然做过八皇后问题。这里再啰嗦几句,皇后可以攻击到同行同列同对角线,在n*n的方格中摆n个皇后使其互不攻击到,求不同的解的数量,这就是经典的n皇后问题。现在问题推广到n皇后问题,这个问题对于你而言实在是小菜一叠。但因为上一次rly把棋盘弄破了,又拿不出新的,所以rly打算难一点点,问题就是破棋盘上的n皇后问题。他想知道……(你们懂的)。
    棋子都是相同的。

    Input

    一行,一个正整数N。
    接下来N行,每行N个数,要么为0,表示没坏,要么1,表示坏了。
    N<=16

    Output

    一行,输出不同的解的数量。

    Sample Input

    4
    1 0 1 1
    1 1 1 0
    0 1 1 1
    1 1 0 1

    Sample Output

    1

    思路:

      n皇后问题, 判一下不放即可。

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int n;
    bool d[300],b[300],c[300];
    int sum,a[300];
    int map[18][18];
    void search(int i)
    {
        for(int j=1;j<=n;j++)
        {
            if((!b[j])&&(!c[i-j+n])&&(!d[i+j])&&(!map[i][j]))
            {
                a[i]=j;
                b[j]=1;
                c[i-j+n]=1;
                d[i+j]=1;
                if(i==n)
                    sum++;
                else
                    search(i+1);
                b[j]=0;
                c[i-j+n]=0;
                d[i+j]=0;
            }
        }
    }
    int main()
    {
        cin>>n;
        for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)scanf("%d", &map[i][j]);
        search(1);
        cout<<sum;
    }
    View Code
  • 相关阅读:
    HDU 1221 Rectangle and Circle 考虑很多情况,good题
    HDU 1223 打表 + 大数
    17984 FFF团的怒火
    17978 倒不了的塔 注意题目
    .. HDU
    17972 Golden gun的巧克力
    9718 整数因子分解(必做) 分治法
    51NOD 1201 整数划分
    Amazon Rekognition 人脸识别
    AWS Config
  • 原文地址:https://www.cnblogs.com/Tobichi/p/9247700.html
Copyright © 2011-2022 走看看