这个题很简单,但我WA了两次,有一个小小的地方需要注意,不要用新值覆盖掉原来的数,否则就错啦!定义一个tmp存储每次改变后的数字就行了。
这段时间一直在做bfs的题目,这个题最多有40个入口,但是很明显偶数是不可能为质数的,所以砍掉偶数就少了一半数据了。
#include<iostream>
#include<cmath>
using namespace std;
int que[1000000];
bool visit[10000];
int main(){
int cases;
cin>>cases;
while(cases--){
int front,rear;
front=rear=0;
memset(que,0,sizeof(que));
memset(visit,0,sizeof(visit));
int first,target;
cin>>first>>target;
que[rear++]=first;
visit[first]=1;
int count=-1;
bool isend=1;
while(front<rear&&isend){
int tail=rear;
count++;
while(front<tail){
int value=que[front++];
if (value==target) {cout<<count<<endl;isend=0;break;}
int a[4];
a[0]=value/1000;
a[1]=(value%1000)/100;
a[2]=(value%100)/10;
a[3]=value%10;
for (int i=0;i<4;i++){
for (int j=1;j<10;j++){
if (i==0&&(a[i]+j)%10==0) continue; //最高位不能为0
if (i==3&&(a[i]+j)%2==0) continue; //偶数一定不是质数
int tmp=(a[i]+j)%10;
int num;
int flag=1;
if (i==0) num=tmp*1000+a[1]*100+a[2]*10+a[3];
else if (i==1) num=a[0]*1000+tmp*100+a[2]*10+a[3];
else if (i==2) num=a[0]*1000+a[1]*100+tmp*10+a[3];
else num=a[0]*1000+a[1]*100+a[2]*10+tmp;
if (num==target) {cout<<count+1<<endl;isend=0;break;}
if (visit[num]==1) continue;
for (int k=2;k<=(int)sqrt((double)num);k++){
if(k>2&&k%2==0) continue;
if (num%k==0) {flag=0;break;}
}
if (flag==1){
que[rear++]=num;
visit[num]=1;
}
}
if (isend==0) break;
}
if (isend==0) break;
}
}
if (isend==1) cout<<"Impossible"<<endl;
}
return 0;
}