保证组合是从小到大排列的 防止重复
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int a[10]= {0,1,2,3,4,5,6,7,8,9};
ll ans;
bool judge(ll n)
{
return sqrt(n)==(ll)(sqrt(n));
}
//x记录上个数大小,i记录当前位数
void dfs(ll x,int i)
{
if(i==10)
{
ans++;
return;
}
if(a[i]==0)
{
if(i==0)
dfs(0,i+1);
return;
}
ll sum=0;
for(int j=i; j<10; j++)
{
sum=(sum*10+a[j]);
if(judge(sum)&&sum>x)
dfs(sum,j+1);
}
}
int main()
{
do
{
dfs(-1,0);
}
while(next_permutation(a,a+10));
cout<<ans<<endl;
return 0;
}