POJ 3126 - Prime Path--BFS

Posted blame

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3126 - Prime Path--BFS相关的知识,希望对你有一定的参考价值。

题目链接:

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

题意:

给出两个四位质数,每次操作可以改变该质数的一位数字,问最少要多少步可以从第一个质数到第二个质数。

代码:

 1 #include<iostream>
 2 #include<queue>
 3 #include<cmath>
 4 #include<cstring>
 5 using namespace std;
 6 int prime[10005]=1,1;   //质数表
 7 typedef struct node
 8 
 9     friend bool operator <(node m,node n)
10     
11         return m.ans>n.ans;
12     
13     int a;
14     int ans;        //ans是当前状态的步数
15 node;
16 void makeprime()   //生成10000以内的质数表
17 
18     int m=sqrt(10000);
19     for(int i=2;i<=m;i++)
20     
21         if(!prime[i])
22         
23             for(int j=i*i;j<=10000;j+=i)
24                 prime[j]=1;
25         
26     
27 
28 int slove(int be,int en)
29 
30     priority_queue<node> q;
31     while(!q.empty())
32         q.pop();
33     node kk;
34     kk.a=be;
35     kk.ans=0;
36     q.push(kk);
37     int vis[10005];
38     memset(vis,0,sizeof(vis));
39     vis[be]=1;
40     while(!q.empty())
41     
42         node k=q.top();
43         node newn;
44         q.pop();
45         if(k.a==en)
46         
47             cout<<k.ans<<endl;
48             return 1;
49         
50         else
51         
52            int ch[5];
53            ch[0]=k.a/1000;   //将数字转化成字符
54            ch[1]=k.a/100-10*ch[0];
55            ch[3]=k.a%10;
56            ch[2]=(k.a%100-ch[3])/10;
57            for(int i=0;i<4;i++)
58             for(int j=0;j<=9;j++)
59             
60                 int m=ch[i];
61                 ch[i]=j;
62                 newn.a=ch[0]*1000+ch[1]*100+ch[2]*10+ch[3];   //将字符转化成数字
63                 newn.ans=k.ans+1;
64                 if(newn.a>=1000&&newn.a<=9999&&!vis[newn.a]&&!prime[newn.a])   //判断生成的数字是否合法
65                     
66                        newn.ans=k.ans+1;
67                         vis[newn.a]=1;
68                         q.push(newn);
69                     
70                ch[i]=m;                    //回溯
71             
72         
73     
74     cout<<"Impossible"<<endl;
75 
76 int main()
77 
78     int n;
79     cin>>n;
80     makeprime();
81     while(n--)
82     
83         int a,b;
84         cin>>a>>b;
85         slove(a,b);
86     
87 

 

以上是关于POJ 3126 - Prime Path--BFS的主要内容,如果未能解决你的问题,请参考以下文章

双向广搜 POJ 3126 Prime Path

POJ-3126 Prime Path

poj-3126 Prime Path

Prime Path POJ-3126

[POJ]P3126 Prime Path[BFS]

POJ-3126 Prime Path