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

来源:互联网 发布:apache 配置php7 编辑:程序博客网 时间:2024/05/16 19:55
问题描述
  给定一个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 <iostream>#include <string>using namespace std;int n = 0;int qp[8][8] = {0};int count = 0;const int black = 2;const int white = 3; void Queue(int i){// i 代表第 i 层 static int bA[22], bB[22], bC[22];static int wA[22], wB[22], wC[22];if(i == n){count++;return;}for(int j = 0 ; j < n; j++){  // j 代表第 j 列 if(qp[i][j] == 1){if(!bA[j] && !bB[i + j + n - 1] && !bC[i - j + n - 1]){bA[j] = bB[i + j + n - 1] = bC[i - j + n - 1] = 1;qp[i][j] = black;for(int k = 0 ; k < n; k++){  // k 代表第 k 列 if(qp[i][k] == 1){if(!wA[k] && !wB[i + k + n - 1] && !wC[i - k + n - 1]){wA[k] = wB[i + k + n - 1] = wC[i - k + n - 1] = 1;qp[i][k] = white;Queue(i + 1);wA[k] = wB[i + k + n - 1] = wC[i - k + n - 1] = 0;qp[i][k] = 1;}} } bA[j] = bB[i + j + n - 1] = bC[i - j + n - 1] = 0;qp[i][j] = 1;}} } }int main(){cin >> n;for(int i = 0; i < n; i++){for(int j = 0; j < n ; j++){cin >> qp[i][j];}}Queue(0);cout << count << endl;return 0;}


0 0
原创粉丝点击