Poj 3126 Prime path
题意
两个四位数的素数A,B。改变A中的一位数,让它变成素数需要1镑,问由A变成B至少需要多少镑?这样的素数对一共有n组。
思路
这是一道bfs题,一定要记住标记已经访问的数,否则会超时。
代码
#include <cstdio>
#include <queue>
#include <cmath>
struct Node{
Node(int a,int b):cur(a),dis(b){}
int cur;
int dis;
};
bool checkPrime(int k){
for(int i=2;i<int(sqrt(k*1.0))+1;++i)
if(0==k%i)
return false;
return true;
}
void getNums(int k,int array[],int& n){
n=0;
int a=k/10*10;
int b=k%10;
for(int i=0;i<10;++i){
if(i!=b)
array[n++]=a+i;
}
a=k/100*100+k%10;
b=k/10%10;
for(int i=0;i<10;++i){
if(i!=b)
array[n++]=a+i*10;
}
a=k/1000*1000+k%100;
b=k%1000/100;
for(int i=0;i<10;++i){
if(i!=b)
array[n++]=a+i*100;
}
a=k%1000;
b=k/1000;
for(int i=1;i<10;++i){
if(i!=b)
array[n++]=a+i*1000;
}
}
int bfs(int a,int b){
int visited[10000];
memset(visited,0,sizeof(visited));
std::queue<Node> q;
q.push(Node(a,0));
visited[a]=1;
while(!q.empty()){
Node front=q.front();
q.pop();
int array[10000];
int n;
getNums(front.cur, array, n);
for(int i=0;i<n;++i){
if(checkPrime(array[i])&&!visited[array[i]]){
if(array[i]==b)
return front.dis+1;
else{
q.push(Node(array[i],front.dis+1));
visited[array[i]]=1;
}
}
}
}
return 0;
}
int main() {
int n;
while(~scanf("%d",&n)&&n!=0){
int a[101][2];
for(int i=0;i<n;++i){
scanf("%d%d",&a[i][0],&a[i][1]);
}
for(int i=0;i<n;++i){
if(a[i][0]==a[i][1])
printf("0\n");
else
printf("%d\n",bfs(a[i][0],a[i][1]));
}
}
return 0;
}