Prime Path POJ - 3126
不想写也不会写的题
考察:素数+bfs
思路:
将每一位的数字改变判断是否出现过并且是否为素数,如果是就纳入队列
错误原因:
上面的思路是很容易想到的,但是后半段我忘了bfs是一步步到达目标的,所以暂时符合要求的就先纳入,再一步步走看是否能到终点
1 #include <iostream> 2 #include <cstdio> 3 #include <queue> 4 #include <cstring> 5 #include <stdlib.h> 6 using namespace std; 7 const int N = 10000; 8 bool h[N],vis[N]; 9 struct Num{ 10 string nums; 11 int step; 12 bool operator==(Num it){ 13 if(it.nums==this->nums) return true; 14 else return false; 15 } 16 }; 17 Num ans; 18 void Get_Prime() 19 { 20 fill(h,h+N,1); 21 for(int i=2;i<N;i++){ 22 if(h[i]) 23 for(int j=2*i;j<N;j+=i) h[j]=0; 24 } 25 } 26 int bfs(Num st) 27 { 28 memset(vis,0,sizeof(vis)); 29 queue<Num> q; 30 st.step = 0; 31 q.push(st); 32 while(!q.empty()) 33 { 34 Num it = q.front(); 35 q.pop(); 36 int d =it.step; 37 if(it==ans) return d; 38 for(int i=0;i<4;i++){ 39 int t = (i==0?1:0); 40 string s = it.nums; 41 for(int j=t;j<10;j++){ 42 s[i] = j+'0'; 43 int next = atoi(s.c_str()); 44 if(h[next]&&!vis[next]&&s!=it.nums){ 45 vis[next]=1; 46 Num tmp; tmp.nums = s; tmp.step=d+1; 47 q.push(tmp); 48 } 49 } 50 } 51 } 52 return -1; 53 } 54 int main() 55 { 56 //freopen("in.txt","r",stdin); 57 int t; 58 scanf("%d",&t); 59 Get_Prime(); 60 Num st; 61 while(t--) 62 { 63 cin>>st.nums>>ans.nums; 64 int ans = bfs(st); 65 if(ans==-1) printf("Impossible\n"); 66 else printf("%d\n",ans); 67 } 68 return 0; 69 }