标签: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 }
标签:cin ssi color cst div lov poj span main
原文地址:https://www.cnblogs.com/blame/p/11352643.html