poj3126Prime Path(bfs)

来源:互联网 发布:fc2无域名版 编辑:程序博客网 时间:2024/06/15 19:46

题目链接:

http://poj.org/problem?id=3126

这道题就是给你两个4位的素数,问你每次只能变换一个位数上的数字,问你需要几次操作把这个数变成另一个。

就是每次都变一个放入队列就好了。。

AC代码:

#include<stdio.h>#include<iostream>#include<string.h>#include<math.h>#include<queue>#include<algorithm>using namespace std;#define maxn 10100int vis[maxn],cnt[maxn],prim[maxn];int star,end;int dig[5];void init(){    int i,j;    memset(prim,0,sizeof(prim));    for(i=1000;i<=10000;i++)    {        for(j=2;j<i;j++)        {            if(i%j==0)                break;        }        if(i==j)            prim[i]=1;    }}int bfs(int st){    int v,temp,num;    memset(cnt,0,sizeof(cnt));    memset(vis,0,sizeof(vis));    queue<int> q;    q.push(st);    vis[st]=1;    while(!q.empty())    {        v=q.front();        dig[0]=v/1000;        dig[1]=v%1000/100;        dig[2]=v%100/10;        dig[3]=v%10;        //printf("%d %d %d %d\n",dig[0],dig[1],dig[2],dig[3]);        q.pop();        for(int i=0;i<4;i++)        {            temp=dig[i];            for(int j=0;j<=9;j++)            {                if(temp!=j)                {                    dig[i]=j;                    num=dig[0]*1000+dig[1]*100+dig[2]*10+dig[3];                    if(vis[num]==0 && prim[num] ==1)                    {                        vis[num]=1;                        q.push(num);                        cnt[num]=cnt[v]+1;                    }                    if(num==end)                        return cnt[num];                }            }            dig[i]=temp;        }        if(v==end) return cnt[v];    }    return -1;}int main(){    int t,ans;    scanf("%d",&t);    init();    while(t--)    {        scanf("%d%d",&star,&end);        ans=bfs(star);        if(ans==-1) printf("Impossible\n");        else printf("%d\n",ans);    }}


0 0