• 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;
    }
    };

    截图:

  • 相关阅读:
    REUSE_ALV_GRID_DISPLAY_LVC I_CALLBACK_HTML_TOP_OF_PAGE
    查找数组中最大值java
    jvm 调优
    jvm 内存
    树形遍历文件夹
    程序创建一个ArrayList,添加1到10的10个随机数,删除大于5的数 java
    字符串反序排序 并带有空格输出 java
    摆动排序
    免密登陆
    springboot UEditor集成
  • 原文地址:https://www.cnblogs.com/w1500802028/p/7296520.html
Copyright © 2020-2023  润新知