您的位置:首页 > 其它

poj 3126 Prime Path bfs

2015-09-08 21:37 274 查看
题目大意:

给定两个四位素数a b,要求把a变换到b

变换的过程要保证 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数 与 前一步得到的素数 只能有一个位不同,而且每步得到的素数都不能重复。求从a到b最少需要的变换次数。无法变换则输出Impossible。

解题思路:

数组模拟队列,先打出10000以内的素数表,然后bfs搜索每一位变化后是否为素数,直到变为b;

代码:

#include <iostream>
#include <string.h>
using namespace std;
struct node
{
int num;
int step;
};
int vis[15000];
void get()//素数打表
{
memset(vis,0,sizeof(vis));
vis[0]=1;
vis[1]=1;
for(int i=2;i<10005;i++)
{
if(!vis[i])
{
for(int j=i+i;j<10005;j+=i)
vis[j]=1;
}
}
}
int a,b;
int flag[15000];//用来标记当前数是否出现过
node que[15000];
void bfs()
{
int head,tail;
que[head=tail=0].num=a;
que[tail++].step=0;
flag[a]=1;
while(head<tail)//模拟队列
{
node x=que[head++];
if(x.num==b)
{
cout<<x.step<<endl;
return;
}
int ge=x.num%10;//获取个位数
int dec=(x.num/10)%10;//获取十位数
for(int i=1;i<=9;i+=2)//变化个位,偶数忽略
{
int y=(x.num/10)*10+i;
if(!vis[y]&&!flag[y]&&y!=x.num)
{
flag[y]=1;
que[tail].num=y;
que[tail++].step=x.step+1;
}
}
for(int i=0;i<=9;i++)//变化十位
{
int y=(x.num/100)*100+i*10+ge;
if(!vis[y]&&!flag[y]&&y!=x.num)
{
flag[y]=1;
que[tail].num=y;
que[tail++].step=x.step+1;
}
}
for(int i=0;i<=9;i++)//百位
{
int y=(x.num/1000)*1000+i*100+dec*10+ge;
if(!vis[y]&&!flag[y]&&y!=x.num)
{
flag[y]=1;
que[tail].num=y;
que[tail++].step=x.step+1;
}
}
for(int i=1;i<=9;i++)//千位,此时千位从1开始
{
int y=x.num%1000+i*1000;
if(!vis[y]&&!flag[y]&&y!=x.num)
{
flag[y]=1;
que[tail].num=y;
que[tail++].step=x.step+1;
}
}
}
cout<<"Impossible"<<endl;
}
int main()
{
int t;
cin>>t;
get();
while(t--)
{
cin>>a>>b;
memset(flag,0,sizeof(flag));
bfs();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: