nk 1504

题目链接:http://acm.nankai.edu.cn/p1504.html

题目大意给你两个四位素数一个作为起始,一个这作为结束。每次只能换中间的一位数字且换后的四位数还为素数,求最少需要几步。

我的垃圾代码

View Code
  1 #include <iostream>
2 #include <queue>
3 #include <cstring>
4 using namespace std;
5 int a[10000],b[10000];
6 int c[5],d[5],g[5]={0,1,10,100,1000};
7 int main ()
8 {
9 int i,j,k,n,m,x,t,flag;
10 k=0;
11 for(i=2;i<=100;i++)
12 for(j=i*i;j<10000;j+=i)
13 a[j]=1;
14 cin>>k;
15
16 while(k--)
17 {
18 cin>>n>>m;
19 flag=0;
20 t=m;
21 for(i=1;i<=4;i++)
22 {
23 d[i]=t%10;
24 t/=10;
25 }
26 memset(b,0,sizeof(b));
27 queue<int>Q;
28 Q.push(n);
29 while(!Q.empty())
30 {
31 t=x=Q.front();
32 Q.pop();
33 if(x==m)
34 {
35 flag=1;
36 break;
37 }
38 for(i=1;i<=4;i++)
39 {
40 c[i]=x%10;
41 x/=10;
42 }
43
44 for(i=1;i<=4;i++)
45 {
46 int k1,k2;
47 x=t;
48 k1=k2=j=c[i];
49 if(i==4){
50 while(k1<9)
51 {
52 k1++;
53 x+=g[i];
54 if(a[x]==0)
55 {
56 if(b[x]==0)
57 {
58 b[x]=b[t]+1;
59
60 Q.push(x);
61 }
62 }
63 }
64 x=t;
65 while(k2>1)
66 {
67 k2--;
68 x-=g[i];
69 if(a[x]==0)
70 {
71 if(b[x]==0)
72 {
73 b[x]=b[t]+1;
74
75 Q.push(x);
76 }
77 }
78 }
79 }
80 else{
81 while(k1<9)
82 {
83 k1++;
84 x+=g[i];
85 if(a[x]==0)
86 {
87 if(b[x]==0)
88 {
89 b[x]=b[t]+1;
90
91 Q.push(x);
92 }
93 }
94 }
95 x=t;
96 while(k2>0)
97 {
98 k2--;
99 x-=g[i];
100 if(a[x]==0)
101 {
102 if(b[x]==0)
103 {
104 b[x]=b[t]+1;
105
106 Q.push(x);
107 }
108 }
109 }
110 }
111 }
112 }
113
114 if(flag)cout<<b[m]<<endl;
115 else cout<<"Impossible"<<endl;
116 while(!Q.empty())
117 Q.pop();
118 }
119 return 0;
120 }

看下牛人的吧

View Code
 1 #include<iostream>
2 using namespace std;
3 #include<cstdio>
4 int queue[10000];
5 int visited[10000];
6 int prm[10000];
7 int dir[4]={1,10,100,1000};
8 void bfs(int v)
9 {
10 int i,j,k,t,item,next_v;
11 int front=-1,rear=0;
12 queue[0]=v;
13 visited[v]=0;
14 while(front<rear)
15 {
16 item=queue[++front];
17 for(i=0;i<4;i++)
18 {
19 t=item;
20 for(k=0;k<i;k++)
21 t/=10;
22 if(i==3)
23 j=1;
24 else
25 j=0;
26 for(;j<10;j++)
27 {
28 next_v=item-dir[i]*(t%10)+dir[i]*j;
29 if(!prm[next_v]&&visited[next_v]==-1)
30 {
31 queue[++rear]=next_v;
32 visited[next_v]=visited[item]+1;
33 }
34 }
35 }
36 }
37 }
38 int main()
39 {
40 int ca,i,j,m,n;
41 memset(prm,0,sizeof(prm));
42 for(i=2;i<5000;i++)
43 if(!prm[i])
44 for(j=i+i;j<10000;j+=i)
45 prm[j]=1;
46 scanf("%d",&ca);
47 while(ca--)
48 {
49 for(i=0;i<10000;i++)
50 visited[i]=-1;
51 scanf("%d%d",&m,&n);
52 bfs(m);
53 if(visited[n]==-1)
54 printf("Impossible\n");
55 else
56 printf("%d\n",visited[n]);
57 }
58 return 0;
59 }
posted @ 2011-08-05 20:45  我们一直在努力  阅读(196)  评论(0编辑  收藏  举报