POJ 3126 广搜

#include<iostream>
#include<queue>
using namespace std;

int a,b,n,num;
int lef[4];
int rig[4];
int mid[4];
int visited[10005];
int d[10005];

int getnum(int aa[]){
	return 1000*aa[0]+100*aa[1]+10*aa[2]+aa[3];
}
//这个函数写错了
void putin(int bb,int cc[]){
	//刚开始没有对cc进行初始化,结果导致三位数的结果,最高位还保留有原来的数值而不是0,
	//但是最后证明是不必要的,因为必须为四位数(验证结果)
	//memset(cc,0,sizeof(cc));
	int i=3;
	while(bb){
		cc[i]=bb%10;
		bb=bb/10;
		i--;
	}
}

bool isPrime(int p){
	if(p==0||p==1)
		return false;
	for(int i=2;i*i<=p;i++)
		if(p%i==0)
			return false;
	return true;
}

int main(){
	scanf("%d",&n);
	queue<int> q;
	while(n--){
		while(!q.empty())
			q.pop();

		scanf("%d%d",&a,&b);
		memset(visited,0,sizeof(visited));
		memset(d,0,sizeof(d));
		num=3;
		putin(a,lef);
		putin(b,rig);
		int ll=getnum(lef);
		visited[ll]=1;

		q.push(ll);
		bool flag=false;
		while(!q.empty()){
			int tmp=q.front();
			q.pop();
			putin(tmp,mid);
			if(tmp==getnum(rig)){
				flag=true;
				break;
			}
			int t;
			for(int i=0;i<4;i++){
				t=mid[i];//这个不能写到j循环的内部
				for(int j=0;j<10;j++){
					mid[i]=j;
					if(visited[getnum(mid)]==0&&isPrime(getnum(mid))&&getnum(mid)>=1000){
						visited[getnum(mid)]=1;
						d[getnum(mid)]=d[tmp]+1;
						q.push(getnum(mid));
					}
				}
				mid[i]=t;
			}
		}
		if(flag){
			printf("%d\n",d[getnum(rig)]);
		}else{
			printf("Impossible\n");
		}
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值