nk 1020

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

题目大意给你一个数字让你把它变成另一个数只有以下三种操作

问题描述:
  题目给出数a(a是一个正整数,不超过50位),再给出目标数b(同样是一个正整数,不超过50位),
数的运算有三种:
  1:使当前数加上1985429
  2:使当前数加上2006
  3:使当前数乘2

  需要你求出这个最小的n(次数),如果n>6,输出-1。(此为负一)。

思路bfs 难点大数的加和乘同时使用bfs

View Code
  1 #include<iostream>
2 #include<queue>
3 #include<cstring>
4 using namespace std;
5 struct ss{
6 int x,y;
7 int a[60];
8 };
9
10 char d[60],k[60];
11 int b[60],c[60],w[60],kk1,kk2;
12 int gg[60]={9,2,4,5,8,9,1};
13 int ee[60]={6,0,0,2};
14 void cop(int *t,int *s,int&e)
15 {
16 int i;
17 for (i=0;i<e;i++)
18 {
19 t[i]=s[i];
20 }
21 }
22 int str(int*t,int*s,int&e1,int&e2)
23 {
24 int i;
25 if (e1>e2)return 0;
26 int flag=0;
27 if(e1==e2)
28 {
29 for (i=e1-1;i>=0;i--)
30 {
31 if(t[i]!=s[i]){flag=1;break;}
32 }
33 if(flag==0) return 1;
34 else return 3;
35 }
36 else return 3;
37
38 }
39 void bfs()
40 {
41 queue<ss>Q;
42 int flag,i,t,w;
43 ss q,p;
44 q.x=0,q.y=kk1;
45 memset(q.a,0,sizeof(q.a));
46 cop(q.a,b,kk1);
47 Q.push(q);
48 flag=0;
49 while (!Q.empty())
50 {
51 q=Q.front();
52 if(str(q.a,c,q.y,kk2)==1){
53 flag=1;
54 w=q.x;
55 break;
56 }
57
58 if (q.x>6||!str(q.a,c,q.y,kk2))
59 {
60 Q.pop();
61 continue;
62 }
63 else{
64 Q.pop();
65
66 p.x=q.x+1;
67 memset(p.a,0,sizeof(p.a));
68 for (i=0;i<q.y;i++)
69 {
70 p.a[i]=q.a[i]*2;
71 }
72 for (i=0;i<q.y;i++)
73 {
74 if(p.a[i]>9)
75 {
76 p.a[i]-=10;
77 p.a[i+1]++;
78 }
79 }
80 if(p.a[i]!=0)p.y=q.y+1;
81 else p.y=q.y;
82 Q.push(p);
83
84 p.x=q.x+1;
85 memset(p.a,0,sizeof(p.a));
86 for (i=0;i<=6;i++)
87 {
88 p.a[i]=q.a[i]+gg[i];
89 }
90 if(q.y<7) {
91 for (i=0;i<=6;i++)
92 {
93 p.a[i]=q.a[i]+gg[i];
94 }
95
96 t=6;
97 for (i=0;i<=t;i++)
98 {
99 if(p.a[i]>9)
100 {
101 p.a[i]-=10;
102 p.a[i+1]++;
103 }
104 }
105 if(p.a[i]!=0)p.y=8;
106 else p.y=7;
107 Q.push(p);
108 }
109 else{
110 for (i=0;i<q.y;i++)
111 {
112 p.a[i]=q.a[i]+gg[i];
113 }
114 for (i=0;i<q.y;i++)
115 {
116 if(p.a[i]>9)
117 {
118 p.a[i]-=10;
119 p.a[i+1]++;
120 }
121 }
122 if(p.a[i]!=0)p.y=q.y+1;
123 else p.y=q.y;
124 Q.push(p);
125 }
126
127 p.x=q.x+1;
128 memset(p.a,0,sizeof(p.a));
129
130 if(q.y<4) {
131 for (i=0;i<=3;i++)
132 {
133 p.a[i]=q.a[i]+ee[i];
134 }
135 t=3;
136 for (i=0;i<=t;i++)
137 {
138 if(p.a[i]>9)
139 {
140 p.a[i]-=10;
141 p.a[i+1]++;
142 }
143 }
144 if(p.a[i]!=0)p.y=5;
145 else p.y=4;
146 Q.push(p);
147 }
148 else{
149 for (i=0;i<q.y;i++)
150 {
151 p.a[i]=q.a[i]+ee[i];
152 }
153 for (i=0;i<q.y;i++)
154 {
155 if(p.a[i]>9)
156 {
157 p.a[i]-=10;
158 p.a[i+1]++;
159 }
160 }
161 if(p.a[i]!=0)p.y=q.y+1;
162 else p.y=q.y;
163 Q.push(p);
164 }
165
166 }
167
168 }
169 if(flag&&q.x<7)cout<<w<<endl;
170 else cout<<"-1"<<endl;
171 while (!Q.empty())
172 {
173 Q.pop();
174 }
175 }
176 int main()
177 {
178 int len1,i;
179 while (cin>>d>>k)
180 {
181 if(!strcmp(d,k)){cout<<"0"<<endl;continue;}
182 else{
183 memset(b,0,sizeof(b));
184 memset(c,0,sizeof(c));
185 kk1=len1=strlen(d);
186 for (i=0;i<len1;i++)
187 {
188 b[len1-i-1]=(d[i]-'0');
189
190 }
191
192 kk2=len1=strlen(k);
193 for (i=0;i<len1;i++)
194 {
195 c[len1-i-1]=(k[i]-'0');
196 }
197
198 }
199 bfs();
200 }
201 return 0;
202 }

posted @ 2011-08-05 21:05  我们一直在努力  阅读(206)  评论(0编辑  收藏  举报