优美的排列--回溯解决

Posted C_YCBX Py_YYDS

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优美的排列--回溯解决相关的知识,希望对你有一定的参考价值。

文章目录

题目

提交代码

class Solution {
public:
    int countArrangement(int n) {
        unsigned int check = 0;
        //两层循环预处理,得到每个位置保持优美的可取数字(i为数字所在位置序号,j为所选数字)
        vector<vector<int> >select(n);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=n;j++){
                if(i%j==0||j%i==0){
                    select[i-1].emplace_back(j);
                }
            }
        }
        int cnt = 0;
        function<void(int)>backtrack = [&](int pos){
            if(pos>=n){
                cnt++;
                return;
            }
            for(auto&&t:select[pos]){
                if(check&(1<<t))
                    continue;
                check = check|(1<<t);
                backtrack(pos+1);
                check = ~((~check)|(1<<t));
            }
        };
        backtrack(0);
        return cnt;
    }
};

以上是关于优美的排列--回溯解决的主要内容,如果未能解决你的问题,请参考以下文章

C++ 回溯排列

回溯算法详解[力扣46:全排列]

使用回溯创建给定列表的排列列表:我做错了啥?

回溯解决方案的大 O 计算范围内的排列

LeetCode 46. 全排列(回溯算法解决)

面试常考算法题---回溯法(学习笔记)