您的位置:首页 > 其它

Poj 3126 Prime Path (BFS 素数打表)

2018-01-18 16:34 453 查看
题意:给你两个个4位数让你求出第一个变成第二个需要几步,每次只能变动一个数,且你变动后的数必须是素数。求出最小步数,否则输出不可能的英文。

题解:先打一个素数表,然后bfs找最小。暴搜每一个位置。具体实现看代码注解。

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

struct node {
int step;
int num;
};
queue <node> Q; // 队列
int prime[100000]; // 素数表 0为素数, 1为非素数
int book[100000]; //标记数组
int start,end; //起始值和目标值

int bfs (){
node now,next;
now.num = start;
now.step = 0;
book[start] = 1;
Q.push(now); // 把起始值入队列
while(!Q.empty()){
now = Q.front();
// cout << now.num << endl;
Q.pop();
if(now.num == end){ // 找到起始值返回结果
return now.step;
}
for(int i = 1 ; i <= 9 ; i ++ ){ // 暴力找个位
int temp = now.num/10 * 10 + i;
//cout << temp << endl;
if(temp !=now.num && !book[temp] && prime[temp] == 0){
book[temp] = 1;
next.num = temp;
next.step = now.step+1;
Q.push(next);
}
}
for(int i = 0 ; i <= 9 ; i ++ ){ // 暴力找十位
int temp = now.num / 100 * 100 + i * 10 + now.num % 10;
if(temp !=now.num &&!book[temp] && prime[temp] == 0){
book[temp] = 1;
next.num = temp;
next.step = now.step+1;
Q.push(next);
}
}
for(int i = 0 ; i <= 9 ; i ++ ){ // 暴力找百位
int temp = now.num / 1000 * 1000 + i * 100 + now.num % 100;
if(temp !=now.num &&!book[temp] && prime[temp] == 0){
book[temp] = 1;
next.num = temp;
next.step = now.step+1;
Q.push(next);
}
}
for(int i = 1 ; i <= 9 ; i ++ ){ // 暴力找千位 ,因为是四位数所以不可能是0开头
int temp = i * 1000 + now.num % 1000;
if(temp !=now.num && !book[temp] && prime[temp] == 0){
book[temp] = 1;
next.num = temp;
next.step = now.step+1;
Q.push(next);
}
}
}
printf("Impossible\n"); // 没有结果
}
int main(){
memset(prime,0,sizeof(prime));
prime[0] = prime[1] = 1;
for(int i = 2 ; i <= 100000;i ++ ){ // 素数打表
if(prime[i] == 0){
for(int j = i+i ; j <100000 ; j+=i){
prime[j] = 1;
}
}
}
int z;
cin >> z;
while(z--){
while(!Q.empty()) Q.pop(); // 清空队列。没有这个会错的
memset(book,0,sizeof(book));
cin >> start >> end;
cout<< bfs() <<endl;;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: