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

    问题描述:

    八皇后问题是十九世纪著名数学家高斯于1850年提出的。问题是:在8*8的棋盘上摆放8个皇后,使其不能互相攻击,即任意的两个皇后不能处在同意行,同一列,或同意斜线上。可以把八皇后问题拓展为n皇后问题,即在n*n的棋盘上摆放n个皇后,使其任意两个皇后都不能处于同一行、同一列或同一斜线上。

    代码如下:

     1 #include <iostream>
     2 #include <cstdlib>
     3 #include <string>
     4 
     5 using namespace std;
     6 
     7 int queen[1024];
     8 int sum;
     9 /**
    10  *八皇后问题 经典递归解法
    11 */
    12 // 打印皇后
    13 void printQ(int n) {
    14     for (int i = 0; i < n; i++) {
    15         for (int j = 0; j < n; j++) {
    16             if (queen[i] == j) {
    17                 cout << "Q ";
    18             }
    19             else {
    20                 cout << "* ";
    21             }
    22         }
    23         cout << endl;
    24     }
    25     
    26 }
    27 // 判断第i行皇后是否合适
    28 bool isValid(int i) {
    29     bool res = true;
    30     for (int j = 0; j < i; j++) {
    31         if (queen[j] == queen[i] || abs(queen[i] - queen[j]) == i - j) {
    32             res = false;
    33             break;
    34         }
    35     }
    36     return res;
    37 }
    38 // 放置皇后,表示把第i行的皇后放在第j列
    39 void placeQueen(int i,int queenCnt) {
    40     if (i == queenCnt) {
    41         cout << "" << sum + 1 << " 组的解为:" << endl;
    42         sum++;
    43         printQ(queenCnt);
    44         return;
    45     }
    46     for (int j = 0; j < queenCnt; j++) {
    47         queen[i] = j;
    48         // 如果第i行皇后放在第j列合法,则放下一行
    49         if (isValid(i)){
    50             placeQueen(i + 1, queenCnt);
    51         }
    52     }
    53 }
    54 
    55 int main()
    56 {
    57     unsigned int queenCnt;
    58     cout << "请输入皇后的个数:";
    59     cin >> queenCnt;
    60     placeQueen(0, queenCnt);
    61     cout << "一共 " << sum << " 解!" << endl;
    62     system("pause");
    63     return 0;
    64 }
    只为训练自己,时刻锤炼一个程序员最基本的技能!
  • 相关阅读:
    java RSA 加签验签【转】
    json遍历 分别使用【原】
    oracle 递归和connect by【转】
    css before after基本用法【转】
    Java Web基础——Action+Service +Dao三层的功能划分
    JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分
    UUID
    在ssh框架中service-action-jsp-formbeam-dao的调用顺序
    Singleton模式(单例模式)
    真正理解、区分Action,Service和Dao功能
  • 原文地址:https://www.cnblogs.com/coding-wtf/p/6891601.html
Copyright © 2011-2022 走看看