AcWing 4519. 正方形数组的数目
原题链接
简单
作者:
Dream_zsh
,
2022-08-06 22:10:11
,
所有人可见
,
阅读 20
C++ 代码
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=15;
int a[N];
bool st[N];
int res;
int n;
bool check(int x)
{
int r = sqrt(x);
return r * r == x;
}
void dfs(int u,int last)
{
if(u==n) res++;
else
{
for(int i=0;i<n;i++)
{
//这些是对枚举的一个优化(剪枝)
if(st[i]) continue; //选过啦
if(!check(a[i]+last)) continue; //和上一个数不组成完全平方数
if(i && !st[i-1] && a[i]==a[i-1]) //每种数的一个这里选第一个
continue;
/*
i 表示他不是第一个数 就是判断第一个区间的
a[i]==a[i-1] 表示当前这个数和前面的数是同一个区间
!st[i-1] 表示前面还有 没用过的 同一区间的数 (我们定的是每个区间选第一个数)
所以当前这个数不是我们选的数
*/
//其他条件选定
st[i]=true;
dfs(u+1,a[i]);
st[i]=false;
}
}
}
int main()
{
cin >>n;
for(int i=0;i<n;i++) cin >>a[i];
sort(a,a+n); //排序后变成一段一段的区间,区间内数相等
for(int i=0;i<n;i++)
if(!i||a[i]!=a[i-1])
{//这里是第一个位置 填一个区间内任意数(选第一个数)
st[i]=true;
dfs(1,a[i]);
st[i]=false;
}
cout <<res<<endl;
return 0;
}