您的位置:首页 > 其它

【BFS】POJ 3126 Prime Path

2017-05-19 09:53 337 查看
Problem Description

输入T组数据,每组数据对应两个千位的素数,要你操作左边的素数变成右边的素数最少的变换(只能改变一个数字,而且变换成的数一定得是素数)次数。

代码:需要注意的点就是,个位数肯定不能是偶数,千位数肯定不能是0

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
queue<int> q;
int v;
int vis[100000];
int judge(int x)//判断这个千位数是不是素数
{
int i;
for(i = 2; i * i <= x; i++)
{
if(x % i == 0) break;
}
if(i * i > x) return 1;
else return 0;
}
void BFS(int u)
{
int i;
while(!q.empty()) q.pop();//初始化
memset(vis, 0, sizeof(vis));
q.push(u);//入队列
vis[u] = 1;
int t, x, y;
while(!q.empty())
{
t = q.front();
q.pop();
if(t == v)
{
printf("%d\n", vis[t] - 1);
return ;
}
for(i = 0; i < 10; i++)//个位
{
if(i % 2 != 0)
{
x = t / 10;
x = x * 10 + i;
if(judge(x) && !vis[x])//如果满足
{
vis[x] = vis[t] + 1;//变换次数+1
q.push(x);//入队列
}
}
}
for(i = 0; i < 10; i++)//十位
{
y = t % 10;
x = t / 100;
x = (x * 10 + i) * 10 + y;
if(judge(x) && !vis[x])
{
vis[x] = vis[t] + 1;
q.push(x);
}
}
for(i = 0; i < 10; i++)//百位
{
y = t % 100;
x = t / 1000;
x = (x * 10 + i) * 100 + y;
if(judge(x) && !vis[x])
{
vis[x] = vis[t] + 1;
q.push(x);
}
}
for(i = 1; i < 10; i++)//千位
{
y = t % 1000;
x = i * 1000 + y;
if(judge(x) && !vis[x])
{
vis[x] = vis[t] + 1;
q.push(x);
}
}
}
}
int main()
{
int T, u;
scanf("%d", &T);
while(T--)
{
scanf("%d %d", &u, &v);
BFS(u);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  bfs poj