• Backtracking


    回溯:当把问题分成若干步骤并递归求解时,如果当前步骤没有合法选择,则函数将返回上一级递归调用,这种现象称为回溯。

    如果在回溯法中使用了辅助的全局变量,则一定要及时把它们恢复原状。特别地,若函数有多个出口,则需在每个出口处回复被修改的值。

    Leetcode 51. N-Queens

    给定$n$,输出$n$皇后问题的所有解。

    class Solution {
    public:
        vector<vector<string>> solveNQueens(int n) {
            vector<vector<int>> vis(3, vector<int>(2 * n, 0));
            vector<int> C(n, 0);
            vector<vector<string>> res;
            search(vis, 0, n, res, C);
            return res;
        }
        
        void search(vector<vector<int>>& vis, int cur, int n, vector<vector<string>>& res, vector<int>& C){
            if(cur == n){
                vector<string> tmp(n, string(n, '.'));
                for(int i = 0; i < n; ++i){
                    tmp[i][C[i]] = 'Q';
                }
                res.push_back(tmp);
            }
            else{
                for(int i = 0; i < n; ++i){
                    if(!vis[0][i] && !vis[1][cur + i] && !vis[2][cur - i + n]){
                        C[cur] = i;
                        vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 1;
                        search(vis, cur + 1, n, res, C);
                        vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 0;
                    }
                }
            }
        }
    };

    Leetcode 52. N-Queens II

    给定$n$,输出$n$皇后解的个数。

    class Solution {
    public:
        int totalNQueens(int n) {
            vector<vector<int>> vis(3, vector<int>(2 * n, 0));
            int total = 0;
            search(vis, total, 0, n);
            return total;
        }
        
        void search(vector<vector<int>>& vis, int& total, int cur, int n){
            if(cur == n) total++;
            else{
                for(int i = 0; i < n; ++i){
                    if(!vis[0][i] && !vis[1][cur + i] && !vis[2][cur - i + n]){
                        vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 1;
                        search(vis, total, cur + 1, n);
                        vis[0][i] = vis[1][cur + i] = vis[2][cur - i + n] = 0;
                    }
                }
            }
        }
    };
  • 相关阅读:
    【算法】百度百科经典算法链接集
    【剑指offer】38.字符串的排列
    Spring整合RabbitMQ
    JVM对象的内存分配,内存布局和访问定位
    记一次需求的表结构设计变更
    sql server中的系统数据库
    HttpWebRequest / HttpWebResponse 远程获取文件信息
    XML的操作
    对于XML无法传输转义字符的问题
    还原数备份文件 SQL语句
  • 原文地址:https://www.cnblogs.com/betaa/p/11690946.html
Copyright © 2020-2023  润新知