nssl1460-逛机房【bfs】

正题


题目大意

n n n次询问,给出一个数 x x x,每次可以进行操作

  1. 修改其中一个位,去掉前导零
  2. 删掉其中一个位,去掉前导零

询问最少步骤使得 x x x变为一个完全平方数


解题思路

我们可以从完全平方数开始广搜,操作变为

  1. 加入一个数
  2. 修改一个数

即可


c o d e code code

#include
#include
#include
#include
using namespace std;
const int N=1e6+10;
int T,f[N],w[1100],ans,k;
bool v[N],z[N];
queue<int> q;
void bfs(){
	while(!q.empty()){
		int x=q.front();k++;
		q.pop();
		for(int i=1;i<=1e5;i*=10){
			for(int k=0;k<10;k++){
				int y=x;y=y/i*i*10+y%i+k*i;
				if(y>=1e6||v[y])continue;
				q.push(y);v[y]=1;
				f[y]=f[x]+1;
			}
		}
		for(int i=1;i<=x;i*=10){
			for(int k=0;k<10;k++){
				if(i*10>x&&k==0)continue;
				int y=x;y=y-y/i%10*i+k*i;
				if(v[y])continue;
				q.push(y);v[y]=1;
				f[y]=f[x]+1;
			}
		}
	}
}
int main()
{
	scanf("%d",&T);
	for(int i=1;i*i<1e6;i++)
		q.push(i*i),v[i*i]=1;
	bfs(); 
	for(int i=1;i<=T;i++){
		int x;scanf("%d",&x);
		if(x==1e6)printf("0\n");
		else printf("%d\n",f[x]);
	}
}

你可能感兴趣的:(广搜,nssl,bfs)