原题链接

不想写也不会写的题

考察:素数+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 }