您的位置:首页 > 其它

hdu 1973 Prime Path

2016-04-19 20:02 337 查看
打印素数表+ bfs

#include "iostream"
#include "queue"
#include "algorithm"
#include "cstring"
#include "stack"

using namespace std;

bool is_prime(int n) {

for(int i = 2; i*i <= n; i++) {
if(n % i == 0) return false;
}

return true;
}

int pow(int n) {

int sum = 1;
for(int i = 1; i <= n; i++) {
sum *= 10;
}
return sum;
}

bool isP[10005],vis[10005];
int d[10005];

void bfs(int a,int b) {

memset(d,0,sizeof(d));
memset(vis,0,sizeof(vis));
queue<int> q;
while(!q.empty()) q.pop();

q.push(a);
d[a] = 0;
while(!q.empty()) {
int num = q.front();q.pop();
if(num == b) {
cout << d[num] << endl;
return;
}

vis[num] = 1;

for(int j = 1; j <= 9; j++)  {
int s = j * 1000 + num % 1000;
if(!vis[s] && isP[s]) {
vis[s] = 1;
d[s] = d[num]+1;
q.push(s);
}
}

for(int j = 0; j <= 9; j++) {
int s = num - num%1000 + num % 100 + j*100;
if(!vis[s] && isP[s]) {
vis[s] = 1;
d[s] = d[num] + 1;
q.push(s);
}
}

for(int j = 0; j <= 9; j++) {
int s = num - num%100 + num % 10 + j*10;
if(!vis[s] && isP[s]) {
vis[s] = 1;
d[s] = d[num] + 1;
q.push(s);
}
}

for(int j = 0; j <= 9; j++) {
int s = num - num%10  + j;
if(!vis[s] && isP[s]) {
vis[s] = 1;
d[s] = d[num] + 1;
q.push(s);
}
}

}
cout << "Impossible" << endl;
return;
}

int main(){
ios::sync_with_stdio(false);

memset(isP,0,sizeof(isP));

for(int i = 1000; i < 10000; i++) isP[i] = is_prime(i);

int T; cin >> T;
while(T--) {
int a,b;
cin >> a >> b;
bfs(a,b);

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bfs hdu