亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

蟲蟲首頁| 資源下載| 資源專輯| 精品軟件
登錄| 注冊

您現在的位置是:首頁 > 技術閱讀 >  每日一題:N皇后問題

每日一題:N皇后問題

時間:2024-02-14


N皇后

設計一種算法,打印 N 皇后在 N × N 棋盤上的各種擺法,其中每個皇后都不同行、不同列,也不在對角線上。這里的“對角線”指的是所有的對角線,不只是平分整個棋盤的那兩條對角線。

示例:

 輸入:4
輸出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
解釋: 4 皇后問題存在如下兩個不同的解法。
[
[".Q..",  // 解法 1
 "...Q",
 "Q...",
 "..Q."],

["..Q.",  // 解法 2
 "Q...",
 "...Q",
 ".Q.."]
]

分析

N皇后是經典的回溯問題,就是每一步都嘗試,每一步都看當前位置是否符合規則,下面我們直接看代碼吧。

代碼

class Solution {
public:
   vector<vector<string>> solveNQueens(int n) {
       used.resize(n, vector<bool>(n, false));
       backtrace(used, 0);
       return ret;
   }

   vector<vector<bool>> used;
   vector<vector<string>> ret;

   void backtrace(vector<vector<bool>> &used, int row) {
       if (row == used.size()) {
           PushString(used);
           return;
       }
       int col = used[0].size();
       for (int i = 0; i < col; ++i) {
           if (IsValid(used, row, i)) {
               used[row][i] = true;
               backtrace(used, row + 1);
               used[row][i] = false;
           }
       }
   }

   void PushString(vector<vector<bool>> &used) {
       vector<string> vec;
       for (auto &v : used) {
           string tem;
           tem.resize(v.size(), '.');
           for (int i = 0; i < v.size(); ++i) {
               if (v[i]) tem[i] = 'Q';
           }
           vec.push_back(tem);
       }
       ret.push_back(vec);
   }

   bool IsValid(vector<vector<bool>> &used, int i, int j) {
       int row = used.size();
       int col = used[0].size();
       for (int ii = 0; ii < i; ++ii) {
           if (used[ii][j]) return false;
       }
       for (int jj = 0; jj < j; ++jj) {
           if (used[i][jj]) return false;
       }
       for (int ii = i - 1, jj = j - 1; ii >= 0 && jj >= 0; ii--, jj--) {
           if (used[ii][jj]) return false;
       }
       for (int ii = i - 1, jj = j + 1; ii >= 0 && jj < col; ii--, jj++) {
           if (used[ii][jj]) return false;
       }
       return true;
   }

};


更多精彩推薦,請關注我們


代碼精進之路


  代碼精進之路,我們一起成長!




C++數組長度可以為變量嗎?

C++中glog源碼剖析以及如何設計一個高效log模塊

想看懂stl代碼,先搞定type_traits是關鍵

C++線程池的實現

主站蜘蛛池模板: 南阳市| 临沧市| 无极县| 安溪县| 临朐县| 云和县| 乐陵市| 德惠市| 织金县| 汝城县| 梁山县| 交城县| 深泽县| 安丘市| 衡水市| 临邑县| 和政县| 桐庐县| 荣昌县| 隆回县| 金平| 固始县| 湘潭市| 昌吉市| 梅河口市| 济宁市| 望江县| 福贡县| 雅安市| 南阳市| 汉沽区| 定安县| 宜都市| 宜丰县| 神池县| 浪卡子县| 咸宁市| 玉田县| 永新县| 阿图什市| 沾化县|