给定一个非负整数数组 A,如果该数组每对相邻元素之和是一个完全平方数,则称这一数组为正方形数组。
返回 A 的正方形排列的数目。
两个排列 A1 和 A2 不同的充要条件是存在某个索引 i,使得 A1[i]≠A2[i]。
输入格式
第一行包含一个整数 n,表示数组 A 的长度。
第二行包含 n 个整数 A[i]。
输出格式
一个整数,表示 A 的正方形排列的数目。
数据范围
1≤n≤12,
0≤A[i]≤109。
输入样例:
3
1 17 8
输出样例:
2
样例解释
[1,8,17] 和 [17,8,1] 都是有效的排列。
2:代码实现
#include<iostream>#include<cstring>#include<algorithm>#include<cmath>usingnamespace std;constint N =15;int n;int w[N];bool st[N];int ans;boolcheck(int x){int r =sqrt(x);return r * r == x;}voiddfs(int u,int last){if(u == n) ans ++;else{for(int i =0; i < n; i ++){if(st[i])continue;// 被用过了if(i &&!st[i -1]&& w[i]== w[i -1])continue;if(!check(last + w[i]))continue;
st[i]=true;dfs(u +1, w[i]);
st[i]=false;}}}intmain(){
cin >> n;for(int i =0; i < n; i ++) cin >> w[i];sort(w, w + n);for(int i =0; i < n; i ++)if(!i || w[i]!= w[i -1]){
st[i]=true;dfs(1, w[i]);
st[i]=false;}
cout << ans << endl;return0;}