您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  path struct