#include <bits/stdc++.h>
#define HASH_SIZE 362881
int count = 0;
typedef long long map[10];
map hash_table[HASH_SIZE];//构造哈希表
map num = {0};
map arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
long long hash(map element)
{
long long value = 0;
int i = 0;
while (i < 10 && element[i] != -1)
{
value *= 10;
value += element[i];
i++;
}
return value % HASH_SIZE;
}
void hash_init()
{
int i, j;
for (i = 0; i < HASH_SIZE; i++)
for (j = 0; j < 10; j++)
hash_table[i][j] = -1;
}
int hash_insert(map element)
{
long long index;
index = hash(element);
while (hash_table[index][0] != -1)
{
if (memcmp(element, hash_table[index], sizeof(map)) == 0)
{
return -1;
}
index ++;
index %= HASH_SIZE;
}
memcpy(hash_table[index], element, sizeof(map));
return 0;
}
void dfs(int pos, int k)
{
int i;
long long sum = 0;
map tmp;
double q;
int j;
if (pos == 10)//当pos为10的时候,说明arr中的元素都已经被获取完
{
memcpy(tmp, num, sizeof(map));
std::sort(tmp, tmp + k);//题目要求不考虑数据的先后顺序,因此每一次都排序完再插入哈希表
if (hash_insert(tmp) != -1)//判断是否重复,不重复就插入并计数
count ++;
return;
}
if (arr[pos] == 0)//因为不能以0开头,所以pos为0的时候直接取0
{
num[k] = 0;
dfs(pos + 1, k + 1);
num[k] = -1;
}
else
{
for (i = pos; i < 10; i++)
{
sum *= 10;
sum += arr[i];//把arr中的元素组成数字
q = sqrt(sum);
if ((int)q - q == 0)//判断是否为平方数
{
num[k] = sum;//如果当前数字为平方数时就获取该数
dfs(i + 1, k + 1);//下一个位置从i + 1开始,因为前i个元素已经被获取,k +1表示已经获取了k个数字
num[k] = -1;//回溯
}
}
}
}
int main()
{
int i;
hash_init();
do
{
for (i = 0; i < 10; i++)//每次都初始化num
num[i] = -1;
dfs(0, 0);
}
while (std::next_permutation(arr, arr + 10));//全排序
printf("%d\n", count);
return 0;
}
08-18
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交