小记:被0坑了一把
思路:bfs最小步数,枚举每一位数,先提前打好素数表。 注意的地方就是0。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAX_ = 10001;
bool vis[MAX_], v[MAX_];
int pri[MAX_];
int M,n,k;
void prime(){
for(int i = 2; i < MAX_; ++i){
if(!vis[i]){
pri[M++] = i;
}
for(int j = 0; j < M && i * pri[j] < MAX_; ++j){
vis[i * pri[j]] = 1;
if(i % pri[j] == 0)break;
}
}
}
void bfs(){
queue<int >q;
int f[4];
memset(v,0,sizeof(v));
q.push(n);
q.push(0);
while(!q.empty()){
int cur = q.front(), step;
q.pop();
step = q.front();
q.pop();
if(cur == k){
cout<<step<<endl;
return ;
}
f[3] = cur % 10;
f[2] = (cur /10)%10;
f[1] = (cur/100)%10;
f[0] = cur /1000;
for(int i = 0; i < 4; ++i){
int tmp = f[i];
for(int j = 0; j < 10; ++j){
if(j == tmp)continue;
f[i] = j;
int cnt = 0;
for(int k = 0; k < 4; ++k){
cnt = cnt * 10 + f[k];
}
if(cnt < 1000)continue;
if(!vis[cnt] && !v[cnt]){
//cout<<"cnt="<<cnt<<endl;
v[cnt] = 1;
q.push(cnt);
q.push(step + 1);
}
}
f[i] = tmp;
}
}
cout<<"Impossible"<<endl;
}
int main() {
int T, sum;
M = 0;
prime();
cin>>T;
while(T--) {
cin>>n>>k;
bfs();
}
return 0;
}