很裸的一个DFS,但因为细节wa了10发才过。果然我还是太弱了。。
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int a[15]={0};
int index=0;
int t;
bool vis[15]={0};
int minum=1000000;
void dfs(int x)
{
int temp=1,res=0,sum=0;
int v=0,i;
if(x==index+1)
{
return;
}
int flag=0;
for(i=0;i<index;i++)
{
if(vis[i]&&a[i]==0)//判断是否有前导零,如果有,这个零必须被删除
{
sum--;
}
else if(vis[i]&&a[i]!=0)
{
break;
}
}
for(i=0;i<index;i++)
{
if(vis[i])
{ flag=1;
res=res*10+a[i];
sum++;
}
}
int tmp=sqrt(res);
if(tmp*tmp==res&&flag==1&&res!=0)
{ //printf("%d %d\n",tmp,res);
minum=min(minum,index-sum);
}
for(i=x;i<index;i++)
{
vis[i]=true;
dfs(i+1);
vis[i]=false;
}
dfs(x+1);
}
int main()
{
long long n;
scanf("%I64d",&n);
memset(vis,false,sizeof(vis));
t=n;
int tt=sqrt(t);
if(tt*tt==t)
{
printf("0\n");
return 0;
}
while(n>0)
{
a[index]=n%10;
n/=10;
index++;
}
reverse(a,a+index);
dfs(0);
if(minum!=1000000) printf("%d\n",minum);
else
{
printf("-1\n");
}
return 0;
}
Educational Codeforces Round 42 (Rated for Div. 2) C. Make a Square
原文:https://www.cnblogs.com/zyf3855923/p/8867205.html