力扣练习——39 正方形数组的数目
1.问题描述
给定一个非负整数数组 A,如果该数组每对相邻元素之和是一个完全平方数,则称这一数组为正方形数组。
返回 A 的正方形排列的数目。两个排列 A1 和 A2 不同的充要条件是存在某个索引 i,使得 A1[i] != A2[i]。
示例 1:
输入:[1,17,8]
输出:2
解释:
[1,8,17] 和 [17,8,1] 都是有效的排列。
示例 2:
输入:[2,2,2]
输出:1
说明:若一个数能表示成某个整数的平方的形式,则称这个数为完全平方数。完全平方数是非负数。
2.输入说明
首先输入A数组的长度n,
然后输入n个整数,以空格分隔。
1 <= n<= 12
0 <= A[i] <= 1e9
3.输出说明
输出一个整数
4.范例
输入
3
1 17 8
输出
2
5.代码
#include <iostream> #include <queue> #include <cstdlib> #include <string> #include<set> #include<algorithm> using namespace std; int ans;//结果 vector<int>t; int used[12] = { 0 }; void dfs(vector<int> &nums); int numSquarefulPerms(vector<int>& nums) { sort(nums.begin(), nums.end());//从小到大排序 dfs(nums); return ans; } void dfs(vector<int>& nums) { if (t.size() == nums.size()) { ans++; return; } for (int i = 0; i < nums.size(); i++) { if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1])continue; if (!used[i]) { if (t.size() == 0 || sqrt(nums[i] + t[t.size() - 1]) - int(sqrt(nums[i] + t[t.size() - 1])) == 0) { used[i] = 1; t.push_back(nums[i]);//弹入 dfs(nums); used[i] = 0;//回溯 t.pop_back();//弹出 } } } } int main() { vector<int>nums; int n,tmp; cin >> n; for (int i = 0; i < n; i++) { cin >> tmp; nums.push_back(tmp); } int res = numSquarefulPerms(nums); cout << res << endl; return 0; }