C++算法:N皇后问题-----递归回溯

匿名 (未验证) 提交于 2019-12-02 23:43:01

题目:

n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。


上图为 8 皇后问题的一种解法。

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

每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。

示例:

输入: 4
输出: [
[".Q…", // 解法 1
“…Q”,
“Q…”,
“…Q.”],

["…Q.", // 解法 2
“Q…”,
“…Q”,
“.Q…”]
]
解释: 4 皇后问题存在两个不同的解法。

代码:

class Solution { public:     vector<vector<string>> solveNQueens(int n) {         vector<vector<string>> ret;                  string str(n, '.');         vector<string> temp(n, str);                  solve(0, n, temp, ret);                  return ret;     }      private:     void solve(int i, int& n, vector<string> temp, vector<vector<string>>& ret){                  if(i == n)         {             ret.push_back(temp);         }                  else         {             for(int j = 0; j < n; j++)             {                                  if(!isValid(temp,i,j,n))                     continue;                                  temp[i][j] = 'Q';                                  solve(i+1, n, temp, ret);                                  //消除                 temp[i][j] = '.';             }         }     }          bool isValid(vector<string> &temp, int& i, int& j, int& n){         int k, l;         for(k = 0; k < i; k++) //正上检查         {             if('Q'==temp[k][j])                 return false;         }          k = i;         l = j;         while(k >= 0 && l >= 0)   //左上检查         {             if('Q'==temp[k][l])                 return false;             k -= 1;             l -= 1;         }          k = i;         l = j;         while(k >= 0 && l < n)    //右上检查         {             if('Q'==temp[k][l])                 return false;             k -= 1;             l += 1;         }          return true;         } }; 
文章来源: https://blog.csdn.net/qq_31820761/article/details/92061060
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!