标签:
Description
1033The cost of this solution is 6 pounds. Note that the digit 1 which got pasted over in step 2 can not be reused in the last step – a new 1 must be purchased.
1733
3733
3739
3779
8779
8179
Input
Output
Sample Input
3 1033 8179 1373 8017 1033 1033
Sample Output
6 7 0
大致题意:
给定两个四位素数a b,要求把a变换到b
变换的过程要保证 每次变换出来的数都是一个 四位素数,而且当前这步的变换所得的素数 与 前一步得到的素数 只能有一个位不同,而且每步得到的素数都不能重复。
求从a到b最少需要的变换次数。无法变换则输出Impossible
大致思路就是BFS+素数判定,还要注意千位的数不得为零,递交为G++,C++不知为何会编译错误
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 #include <queue> 6 using namespace std; 7 const int maxn=10000; 8 struct node 9 { 10 int num; 11 int step; 12 }; 13 bool prime[maxn],vis[maxn]; 14 void fun_prime() 15 { 16 prime[0]=prime[1]=false; 17 for(int i=2; i*i<maxn; i++) 18 { 19 if(prime[i]) 20 { 21 for(int j=i+i; j<maxn; j+=i) 22 prime[j]=false; 23 } 24 } 25 } 26 void bfs(int a,int b) 27 { 28 int sz[10]={1,10,100,1000}; 29 if(a==b) 30 { 31 cout<<0<<endl; 32 return ; 33 } 34 memset(vis,false,sizeof(vis)); 35 queue<node >q; 36 vis[a]=true; 37 q.push((node) 38 { 39 a,0 40 }); 41 while(!q.empty()) 42 { 43 node head=q.front(); 44 q.pop(); 45 for(int i=0; i<4; i++) 46 { 47 for(int j=0; j<10; j++) 48 { 49 if(i==3 && j==0) //千位不得为零 50 continue; 51 int t=head.num%sz[i]+j*sz[i]+head.num/(sz[i]*10)*(sz[i]*10); 52 if(t==b) 53 { 54 cout<<head.step+1<<endl; 55 return ; 56 } 57 if(prime[t]&&!vis[t]) 58 { 59 vis[t]=true; 60 q.push((node) 61 { 62 t,head.step+1 63 }); 64 } 65 66 } 67 } 68 } 69 cout<<"Impossible"<<endl; 70 } 71 int main() 72 { 73 int t,a,b; 74 cin>>t; 75 memset(prime,true,sizeof(prime)); 76 fun_prime(); 77 while(t--) 78 { 79 cin>>a>>b; 80 bfs(a,b); 81 } 82 return 0; 83 }
标签:
原文地址:http://www.cnblogs.com/cxbky/p/4892811.html