文章

10

粉丝

66

获赞

3

访问

45.3k

头像
题解:全排列 + 剪枝
P895 上海交通大学2021年机试题
发布于2022年5月22日 12:03
阅读数 5.7k

搜索出所有全排列的组合

判断相邻数之和是否为平方数的限制,来剪枝。

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    int res=0;
    vector<int> tmp;
    vector<int> vis;

    bool isPingFang(int num){
        int sq=(int)(sqrt(num)+0.5);
        return sq*sq==num;
    }

    void dfs(vector<int>& nums){
        if(nums.size()==tmp.size()){
            res++;
            return;
        }
        for(int i=0; i<nums.size();i++){
            if(vis[i]||(i>0&&nums[i]==nums[i-1]&&!vis[i-1])||(tmp.size()>0&&!isPingFang(tmp.back()+nums[i])))continue;
            vis[i]=1;
            tmp.emplace_back(nums[i]);
            dfs(nums);
            vis[i]=0;
            tmp.pop_back();
        }
        
    }

    int numSquarefulPerms(vector<int>& nums) {
        vis.resize(nums.size());
        sort(nums.begin(), nums.end());
        dfs(nums);
        return res;
    }
};

int mai...
登录查看完整内容


登录后发布评论

2 条评论
west
2022年5月24日 16:06

continue条件里,去重是怎么判断的呀

 

赞(0)

snake : 回复 west: 去重就这一个函数判断的吧isPingFang,前面的判断条件应该是对全排列的优化

2022年5月24日 20:56