Educational Codeforces Round 42 (Rated for Div. 2) C. Make a Square

很裸的一个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
",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
");
        return 0;
    }
    while(n>0)
    {
        a[index]=n%10;
        n/=10;
        index++;
    }
    reverse(a,a+index);
    dfs(0);
    if(minum!=1000000) printf("%d
",minum);
    else
    {
        printf("-1
");
    }
    return 0;
}