记录编号 224673 评测结果 AAAAAAAAAA
题目名称 [省常中] 素数路 最终得分 100
用户昵称 Gravatarliu_runda 是否通过 通过
代码语言 C++ 运行时间 0.008 s
提交时间 2016-02-16 15:41:53 内存使用 0.37 MiB
显示代码纯文本
#include<cstdio>
#include<queue>
using namespace std; 
bool not_prime[10005];
bool prime[10][10][10][10];
bool able[10][10][10][10];
int step[10][10][10][10];
struct num{
	int a,b,c,d;
	num(int A,int B,int C,int D){
		a=A;b=B;c=C;d=D;
	}
};
queue<num> q;
int main(){
	freopen("primepath.in","r",stdin);
	freopen("primepath.out","w",stdout);
	for(int i = 2;i<101;++i){
		if(!not_prime[i]){
			for(int j = i*i;j<10005;j+=i)not_prime[j]=true;
		}
	}
	for(int i = 1000;i<10000;++i){
		if(!not_prime[i]){
			prime[i/1000][i/100%10][i/10%10][i%10]=true;
		}
	}
	int n,m;
	scanf("%d %d",&n,&m);
	able[n/1000][n/100%10][n/10%10][n%10]=true;
	q.push(num(n/1000,n/100%10,n/10%10,n%10));
	while(!q.empty()){
		num tmp=q.front();
		for(int i = 1;i<=9;++i){
			if(q.front().a!=i){
				tmp.a=i;
				if(prime[tmp.a][tmp.b][tmp.c][tmp.d]){
					if(!able[tmp.a][tmp.b][tmp.c][tmp.d]){
						able[tmp.a][tmp.b][tmp.c][tmp.d]=true;
						step[tmp.a][tmp.b][tmp.c][tmp.d]=step[q.front().a][tmp.b][tmp.c][tmp.d]+1;
						q.push(num(tmp.a,tmp.b,tmp.c,tmp.d));
					}
				}
			}
		}
		tmp = q.front();
		for(int i = 0;i<=9;++i){
			if(q.front().b!=i){
				tmp.b=i;
				if(prime[tmp.a][tmp.b][tmp.c][tmp.d]){
					if(!able[tmp.a][tmp.b][tmp.c][tmp.d]){
						able[tmp.a][tmp.b][tmp.c][tmp.d]=true;
						step[tmp.a][tmp.b][tmp.c][tmp.d]=step[tmp.a][q.front().b][tmp.c][tmp.d]+1;
						q.push(num(tmp.a,tmp.b,tmp.c,tmp.d));
					}
				}
			}
		}
		tmp=q.front();
		for(int i = 0;i<=9;++i){
			if(q.front().c!=i){
				tmp.c=i;
				if(prime[tmp.a][tmp.b][tmp.c][tmp.d]){
					if(!able[tmp.a][tmp.b][tmp.c][tmp.d]){
						able[tmp.a][tmp.b][tmp.c][tmp.d]=true;
						step[tmp.a][tmp.b][tmp.c][tmp.d]=step[tmp.a][tmp.b][q.front().c][tmp.d]+1;
						q.push(num(tmp.a,tmp.b,tmp.c,tmp.d));
					}
				}
			}
		}
		tmp=q.front();
		for(int i = 0;i<=9;++i){
			if(q.front().d!=i){
				tmp.d=i;
				if(prime[tmp.a][tmp.b][tmp.c][tmp.d]){
					if(!able[tmp.a][tmp.b][tmp.c][tmp.d]){
						able[tmp.a][tmp.b][tmp.c][tmp.d]=true;
						step[tmp.a][tmp.b][tmp.c][tmp.d]=step[tmp.a][tmp.b][tmp.c][q.front().d]+1;
						q.push(num(tmp.a,tmp.b,tmp.c,tmp.d));
					}
				}
			}
		}
		q.pop();
	}
	if(able[m/1000][m/100%10][m/10%10][m%10])printf("%d\n",step[m/1000][m/100%10][m/10%10][m%10]);
	else printf("Impossible\n");
	fclose(stdin);fclose(stdout);
	return 0;
}