原题链接:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11662&courseid=0
由于每次只改变一个数字,n也只是4位数,可以暴力,也可以BFS
AC代码:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
bool vis2[10000];
bool OK(int n)
{
int x=sqrt(n);
return x*x==n;
}
int main()
{
int T,kase=0;
//freopen("j.txt","r",stdin);
cin>>T;
while(T--)
{
int n;
cin>>n;
int a[4];
int k=3;
while(n)
{
a[k--]=n%10;
n/=10;
}
bool vis1[10];
int ans=0;
printf("Case %d: ",++kase);
memset(vis2,false,sizeof(vis2));
for(int i=0; i<4; i++)
{
memset(vis1,false,sizeof(vis1));
vis1[a[i]]=true;
if(i==0) vis1[0]=true;
for(int j=0; j<10; j++)
{
if(!vis1[j])
{
int p;
if(i==0)
p=j*1000+a[1]*100+a[2]*10+a[3];
else if(i==1)
p=a[0]*1000+j*100+a[2]*10+a[3];
else if(i==2)
p=a[0]*1000+a[1]*100+j*10+a[3];
else if(i==3)
p=a[0]*1000+a[1]*100+a[2]*10+j;
if(!vis2[p]&&OK(p))
{
vis1[j]=true;
vis2[p]=true;
ans++;
}
}
}
}
cout<<ans<<endl;
}
return 0;
}
转载请注明出处:http://blog.csdn.net/hurmishine