蓝桥基础练习 2n皇后问题 BASIC-27(搜索)

问题描述

  给定一个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
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <deque>
#include <cmath>
#include <map>

using namespace std;
typedef long long ll;

#define INF 0x7fffffff
const double inf=1e20;
const int maxn=1000+10;
const int mod=1e7;
const double pi=acos(-1);

int a[10][10];
int vis[3][50];
int vis2[3][50];
int tot;
int n;
int c[50];

void search_2(int cur){
    if(cur==n){
        tot++;
    }
    else for(int i=0;i<n;i++){
        if(!vis2[0][i]&&!vis2[1][cur+i]&&!vis2[2][cur-i+n]&&a[cur][i]==1){
            vis2[0][i]=vis2[1][cur+i]=vis2[2][cur-i+n]=1;
            a[cur][i]=0;
            search_2(cur+1);
            a[cur][i]=1;
            vis2[0][i]=vis2[1][cur+i]=vis2[2][cur-i+n]=0;
        }
    }
}

void search_(int cur){
    if(cur==n){
        search_2(0);
    }
    else for(int i=0;i<n;i++){
        if(!vis[0][i]&&!vis[1][cur+i]&&!vis[2][cur-i+n]&&a[cur][i]==1){
            vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=1;
            a[cur][i]=0;
            search_(cur+1);
            a[cur][i]=1;
            vis[0][i]=vis[1][cur+i]=vis[2][cur-i+n]=0;
        }
    }
}

int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            scanf("%d",&a[i][j]);
        }
    }
    tot=0;
    search_(0);
    printf("%d\n",tot);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/wz-archer/p/12502376.html