zoukankan      html  css  js  c++  java
  • 2n皇后问题

    Description
    给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
    Input
    输入描述:
    输入的第一行为一个整数n,表示棋盘的大小。
    接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
    Output
    输出描述:
    输出一个整数,表示总共有多少种放法。

    输入样例:
    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

     1 #include <cmath>
     2 #include <iostream>
     3 using namespace std;
     4 int n, map[8][8], ans;
     5 int bqueenPos[100]; //黑皇后的位置 
     6 int wqueenPos[100]; //白皇后的位置 
     7 
     8 void WQueen(int k) { //摆放白皇后 
     9     if (k == n) { //n个白皇后摆放好 
    10         ans++;  //摆放方法 +1 
    11     }
    12     int i, j;
    13     for (i = 0; i < n; i++) {
    14         if (map[k][i] == 0) continue;
    15         if (bqueenPos[k] == i) continue; //测试是否黑皇后摆放的位置 
    16         for (j = 0; j < k; j++) {
    17             if (wqueenPos[j] == i || 
    18                 abs(wqueenPos[j] - i) == abs(k - j)) {
    19                 break;
    20             }
    21         }
    22         if (j == k) {
    23             wqueenPos[k] = i;
    24             WQueen(k + 1);
    25         }
    26     }
    27 }
    28 
    29 void BQueen(int k) { //摆放黑皇后 
    30     if (k == n) { //n个黑皇后已经摆好 
    31         WQueen(0); //开始摆放白皇后 
    32     }
    33     int i, j;
    34      for (i = 0; i < n; i++) { // k行i列,逐尝试第 k 黑皇后的位置 
    35          if (map[k][i] == 0) continue;  //map中不能摆放皇后的位置 
    36         for (j = 0; j < k; j++) {     
    37             //和已经摆好的 k 个黑皇后位置比较,看看是否冲突 
    38             if (bqueenPos[j] == i ||   
    39                 abs(bqueenPos[j] - i) == abs(k - j)) { 
    40                 break; //冲突,测试下一个位置 
    41             }
    42         }
    43         if (j == k) { //和前面的 k 个黑皇后不冲突 
    44             bqueenPos[k] = i; //记录第 k 个黑皇后的位置 
    45             BQueen(k + 1); //递归 k+1 
    46         }    
    47     }
    48 }
    49 
    50 int main() {
    51     ans = 0;
    52     cin >> n;
    53     for (int i = 0; i < n; i++) {
    54         for (int j = 0; j < n; j++) {
    55             cin >> map[i][j];
    56         }
    57     }
    58     BQueen(0);
    59     cout << ans << endl;
    60     return 0;
    61 }
  • 相关阅读:
    tkinter 对键盘和鼠标事件的处理
    python基础知识字符串与元祖
    python中的raw string的使用
    python使用tkinter做界面之颜色
    windows强制删除文件和文件夹
    Python 类的继承__init__() takes exactly 3 arguments (1 given)
    python tkinter txt窗口,开线程两个卡死
    python Tkinter的Text组件中创建x轴和y轴滚动条,并且text文本框自动更新(三)
    tkinter界面卡死的解决办法
    python Tkinter的Text组件中创建x轴和y轴滚动条,并且text文本框自动更新(二)
  • 原文地址:https://www.cnblogs.com/ranzhong/p/13753049.html
Copyright © 2011-2022 走看看