题解 | 正方形的数目

正方形的数目

https://www.nowcoder.com/practice/57621c5924dc4df5a53e2651e30b7f23

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

int n;
int ans = 0;
vector<int>arr;

bool f(int a, int b){    //判断完全平方
    int s = a+b;     
    int r = sqrt(s);    //该步不可跳过
    if(r*r == s){      //不能写成sqrt(s)*sqrt(s) == s
        return true;
    }
    return false;
}

//搜索
void back(int num, int pos, vector<int>& visit){  
    if(num == n){      //选完所有的,能到这一步即是符合条件排列
        ans ++;
        return;
    }
    int flag = 0;   //用来判断是不是第一个选的
    int pre;   //保存上一个选的
    for(int i = 0; i < n; i++){
        if(visit[i]){     //筛选出选过的数
            continue;
        }
        if(flag == 0){    //第一个选的
            flag = 1;
        }
        else{    //之后选的
            if(arr[i] == arr[pre]){     //跳过重复的数
                continue;
            }
        }
        pre = i;   //保存上一个选的
        if(f(arr[pos], arr[i])){    //满足条件
            visit[i] = 1;
            back(num+1, i, visit);    //搜索下一个数
            visit[i] = 0;
        }
    }
}

int main() {
    cin >> n;
    arr.resize(n);
    for(int i = 0; i < n;i ++){
        cin >> arr[i];
    }
    sort(arr.begin(), arr.end());     //排序方便去重 
    vector<int>visit(n, 0);
    for(int i = 0; i < n; i++){
        if(i > 0 && arr[i] == arr[i-1]){   //去重
            continue;
        }
        visit[i] = 1;    
        back(1, i, visit);      //将arr[i]作为第一个
        visit[i] = 0;
    }
    cout << ans << endl;
    return 0;
}

全部评论

相关推荐

白火同学:1、简历可以浓缩成一页,简历简历先要“简”方便HR快速过滤出有效信息,再要“历”用有效信息突出个人的含金量。 2、教育背景少了入学时间~毕业时间,HR判断不出你是否为应届生。 3、如果你的平台账号效果还不错,可以把账号超链接或者用户名贴到对应位置,一是方便HR知道你是具体做了什么内容的运营,看到账号一目了然,二是口说无凭,账号为证,这更有说服力。
面试被问期望薪资时该如何...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务