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

    题目:

    n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。

    给定一个整数n,返回所有不同的n皇后问题的解决方案。

    每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。

    算法:对该行的每一列进行探测,看是否可以放置皇后,如果可以,则在该列放置一个皇后,然后继续探测下一行的皇后位置。如果已经探测完所有的列都没有找到可以放置皇后的列,就应该回溯,再把上一行皇后的位置往后移一列,如果上一行皇后移动后也找不到位置,则继续回溯直至某一行找到皇后的位置或回溯到第一行,如果第一行皇后也无法找到可以放置皇后的位置,则说明已经找到所有的解程序终止。如果该行已经是最后一行,则探测完该行后,如果找到放置皇后的位置,则说明找到一个结果,打印出来

    代码:

    class Solution {
    public:
    /**
    * Get all distinct N-Queen solutions
    * @param n: The number of queens
    * @return: All distinct solutions
    * For example, A string '...Q' shows a queen on forth position
    */
    vector<vector<string> > solveNQueens(int n) {
    // write your code here
    if(n == 1) {
    vector<vector<string> > result;
    vector<string> strOneRow;
    strOneRow.push_back("Q");
    result.push_back(strOneRow);
    return result;
    }
    else if(n < 4) {
    return vector<vector<string> > ();
    }

    vector<vector<string> > result;
    int i;

    int *pCheckerboard = new int[n];
    for(i=0; i<n; i++) {
    pCheckerboard[i] = -1;
    }

    queensRecursively(0, n, pCheckerboard, result);

    delete[] pCheckerboard;
    return result;
    }

    void queensRecursively(int row, int n, int *pCheckerboard, vector<vector<string> > &result) {
    int i = 0, j = 0;
    if(n == row) {
    vector<string> strOneRow;
    for(i=0; i<n; i++) {
    string str;
    for(j=0; j<n; j++) {
    str += '.';
    }
    if(pCheckerboard[i]>=0 && pCheckerboard[i]<n) {
    str[pCheckerboard[i]] = 'Q';
    }
    strOneRow.push_back(str);

    }
    result.push_back(strOneRow);
    }
    else {
    for(i=0; i<n; i++) {
    if(canPlace(row, i, n, pCheckerboard)) {
    pCheckerboard[row] = i;
    queensRecursively(row+1, n, pCheckerboard, result);
    }
    }
    }
    }

    int canPlace(int row, int col, int n, int *pCheckerboard) {
    int i;
    for(i=0; i<n && i!=row; i++) {
    if(pCheckerboard[i] == col) {
    return 0;
    }
    if(abs(row-i) == abs(col-pCheckerboard[i])) {
    return 0;
    }
    }
    return 1;
    }
    };

    截图:

  • 相关阅读:
    Python--前端之HTML
    Python--MySql(主键的创建方式、存储引擎、存储过程、索引、pymsql)
    python--MySql(外键约束、多表查询(*****))
    python--MySql 表记录的操作
    python--MySql
    Python--线程队列(queue)、multiprocessing模块(进程对列Queue、管道(pipe)、进程池)、协程
    Python--同步锁(互斥锁)、死锁(状态)、递归锁、信号量、Event对象
    Python--多线程、多进程常用概念
    Python--基础之socket编程
    ubuntu 安装 flashplayer
  • 原文地址:https://www.cnblogs.com/w1500802028/p/7296520.html
Copyright © 2011-2022 走看看