文章

11

粉丝

27

获赞

19

访问

1.3k

头像
正方形数组的数目 是一道经典的用回溯法解决排列组合的问题
P895 上海交通大学2021年机试题
发布于2025年2月4日 15:01
阅读数 18

//895-正方形数组的数目

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

// 判断一个数是否是完全平方数
bool isPerfectSquare(int num) {
    if (num < 0) return false;
    int sqrtNum = sqrt(num);
    return sqrtNum * sqrtNum == num;
}

//重点是如何理解回溯函数,如何将n!种情况都考虑到的,每选完一个位置就递归调用backtrack,继续寻找下一个位置的合适人选,而每一次筛选都会从头再次筛人 
// 回溯函数,用于生成所有满足条件的排列
void backtrack(vector<int>& nums, vector<bool>& used, vector<int>& path, int& count) {
    // 如果当前路径的长度等于数组长度,说明找到一个有效的排列
    if (path.size() == nums.size()) {
        count++;
        return;
    }

    for (int i = 0; i < nums.size(); i++) {
        // 如果当前元素已经被使用过,跳过
        if (used[i]) continue;

        // 如果当前元素与前一个元素的和不是完全平方数,跳过
        if (!path.empty() && !isPerfectSquare(path.back() + nums[i])) continue;

        // 避免重复排列:如果当前元素与前一个元素相同,并且前一个元素未被使用,跳过
        if (i > 0 && nums[i] == nums[i - 1] ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发