码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 3126 - Prime Path--BFS

时间:2019-08-14 17:29:09      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:cin   ssi   color   cst   div   lov   poj   span   main   

题目链接:

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

标签:cin   ssi   color   cst   div   lov   poj   span   main   

原文地址:https://www.cnblogs.com/blame/p/11352643.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!