POJ 3126 Prime Path
2012-04-13 18:27
447 查看
bfs。
bfs很好写,注意细节得。
/*
POJ: 3126 Prime Path
*/
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
using namespace std;
struct Node {
int n;
int step;
Node(int _n, int _step) : n(_n), step(_step) {}
};
int prime[10005];
int a, b;
bool visited[10005];
queue<struct Node> que;
int digit[4];
void getPrime()
{
memset(prime, true, sizeof(prime));
prime[0] = prime[1] = false;
for(int i = 2; i * i <= 10005; i++)
if(prime[i])
for(int k = i + i; k <= 10005; k += i)
prime[k] = false;
}
int bfs()
{
if(a == b)
return 0;
while(!que.empty())
que.pop();
memset(visited, false, sizeof(visited));
visited[a] = true;
que.push(Node(a, 0));
while(!que.empty()) {
struct Node tmp = que.front();
que.pop();
int i = 0;
while(tmp.n) {
digit[i++] = tmp.n % 10;
tmp.n /= 10;
}
for(i = 0; i < 4; i++) {
int pre = digit[i];
for(int j = 0; j < 10; j++) {
if(i == 3 && j == 0)
continue;
digit[i] = j;
int num = 1000 * digit[3] + 100 * digit[2] + 10 * digit[1] + digit[0];
if(prime[num] && !visited[num]) {
if(num == b)
return tmp.step + 1;
else {
que.push(Node(num, tmp.step + 1));
visited[num] = true;
}
}
}
digit[i] = pre;
}
}
return -1;
}
int main()
{
//freopen("data.in", "rb", stdin);
int t;
getPrime();
scanf("%d", &t);
while(t--) {
scanf("%d%d", &a, &b);
int res = bfs();
if(res == -1)
printf("Impossible\n");
else
printf("%d\n", res);
}
return 0;
}
bfs很好写,注意细节得。
/*
POJ: 3126 Prime Path
*/
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
using namespace std;
struct Node {
int n;
int step;
Node(int _n, int _step) : n(_n), step(_step) {}
};
int prime[10005];
int a, b;
bool visited[10005];
queue<struct Node> que;
int digit[4];
void getPrime()
{
memset(prime, true, sizeof(prime));
prime[0] = prime[1] = false;
for(int i = 2; i * i <= 10005; i++)
if(prime[i])
for(int k = i + i; k <= 10005; k += i)
prime[k] = false;
}
int bfs()
{
if(a == b)
return 0;
while(!que.empty())
que.pop();
memset(visited, false, sizeof(visited));
visited[a] = true;
que.push(Node(a, 0));
while(!que.empty()) {
struct Node tmp = que.front();
que.pop();
int i = 0;
while(tmp.n) {
digit[i++] = tmp.n % 10;
tmp.n /= 10;
}
for(i = 0; i < 4; i++) {
int pre = digit[i];
for(int j = 0; j < 10; j++) {
if(i == 3 && j == 0)
continue;
digit[i] = j;
int num = 1000 * digit[3] + 100 * digit[2] + 10 * digit[1] + digit[0];
if(prime[num] && !visited[num]) {
if(num == b)
return tmp.step + 1;
else {
que.push(Node(num, tmp.step + 1));
visited[num] = true;
}
}
}
digit[i] = pre;
}
}
return -1;
}
int main()
{
//freopen("data.in", "rb", stdin);
int t;
getPrime();
scanf("%d", &t);
while(t--) {
scanf("%d%d", &a, &b);
int res = bfs();
if(res == -1)
printf("Impossible\n");
else
printf("%d\n", res);
}
return 0;
}
相关文章推荐
- POJ-3126--Prime Path---BFS广搜
- POJ 3126 Prime Path SPFA
- Poj 3126 Prime Path (BFS 素数打表)
- POJ 3126 Prime Path(BFS + 素数打表)
- POJ 3126 Prime Path【素数+bfs】
- POJ 3126 Prime Path
- POJ-3126 Prime Path 解题报告
- Mathematics:Prime Path(POJ 3126)
- POJ_3126Prime Path解题报告
- POJ 3126 Prime Path 简单广搜(BFS)
- [数论] POJ 3126 Prime Path
- poj 3126 Prime Path(BFS)
- Poj-3126-Prime Path [bfs]
- POJ ~ 3126 ~ Prime Path(BFS+打表)
- POJ 3126 Prime Path
- POJ 3126 Prime Path(首相的无厘头要求,这个是不是华盛顿,BFS)
- POJ 3126 Prime Path SPFA
- POJ 3126-Prime Path(BFS-素数变换一位)
- (BFS11.1.1)POJ 3126 Prime Path(计算从初始素数到目标素数的最短路径长度)
- day6 POJ 3126 Prime Path