丑陋的代码:因为溢出问题被hack,很难受
//打表 bfs
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn=1e5;
set<LL>s;
string n;
struct node{
string k;
int dist;
node(string k,int dist):k(k),dist(dist) {}
};
LL field(string x)
{
LL sum=0;
LL f=1;
for(int i=0;i<x.length();i++)
f*=10;
f/=10;
for(int i=0;i<x.length();i++)
{
sum+=f*(x[i]-'0');
f/=10;
}
return sum;
}
int bfs()
{
queue<node>pq;
while(!pq.empty()) pq.pop();
pq.push(node(n,0));
while(!pq.empty())
{
node p=pq.front();
pq.pop();
LL x=field(p.k);
/*cout<<x<<endl;
if(s.find(x)!=s.end()) {
cout<<sqrt(x)<<endl;
}*/
if(s.find(x)!=s.end()) return p.dist;
string z;
z.clear();
z=p.k;
if(z.length()==1) continue;
//cout<<z<<endl;
for(int i=0;i<z.length();i++) //依次选取要删除的字符
{
string y;
y.clear();
for(int j=0;j<z.length();j++)
if(j!=i) y+=z[j];
//cout<<y<<endl;
if(y[0]!='0') {
pq.push(node(y,p.dist+1));
}
}
}
return -1;
}
int main()
{
s.clear();
for(LL i=1;i<=maxn;i++)
{
s.insert(LL(i*i));
}
getline(cin,n,'\n');
cout<<bfs()<<endl;
}