POJ 3278 -- Catch That Cow
阿新 • • 發佈:2018-02-21
mem node ron log deep poj style ring height
POJ 3278 -- Catch That Cow
題意:
給定兩個整數n和k
通過 n+1或n-1 或n*2 這3種操作,使得n==k
輸出最少的操作次數
解題思路:
@使用BFS,已經訪問過的數值不再進行下一層的搜索,使用bool visit[maxn]標記,k最大為10W,所以設置maxn為10W+3足矣
@進行剪枝 當前要檢索的數值為n,其下一層的數值有三個取值n-1,n+1,2*n
設這個取值為temp
1.temp<0 或者 temp>maxn 越界,則不管它
簡單說明一下我對最大值越界的理解吧...如果k=100000,當temp=100020>100003(maxn)應該舍棄,因為若有一個數為100002,則100002到100000的步數定比100020少。最小值越界同理。
2.temp已經訪問過,不再進行處理
1)使用STL的queue
1 #include<iostream>
2 #include<queue>
3 #include<cstring>
4 using namespace std;
5 const int maxn = 100003;
6 int change(int x,int ch)
7 {///0為x-1,1為x+1,2為2*x
8 if(ch == 0)
9 return x-1;
10 if(ch == 1)
11 return x+1;
12 if(ch == 2)
13 return 2*x;
14 }
15
16 struct node{
17 int num;
18 int deep;
19 node(int num,int deep):num(num),deep(deep){}
20 };
21
22 bool visit[maxn];
23
24 int main()
25 {
26 int n,k;
27 while(cin>>n>>k)
28 {
29 queue<node> q;
30 memset(visit,false ,sizeof(visit));
31 node u(n,0);
32 q.push(u);
33 visit[n] = true;
34 int head = 0;
35 int rear = 1;
36 while(!q.empty())
37 {
38 u = q.front();q.pop();
39 if(u.num == k)
40 {
41 cout<<u.deep<<endl;
42 break;
43 }
44 for(int i=0;i<3;i++)
45 {
46 int temp = change(u.num,i);
47 if(0<=temp && temp<=maxn && !visit[temp])
48 {
49 node v(temp,u.deep+1);
50 q.push(v);
51 visit[temp] = true;
52 }
53 }
54 }
55 }
56 return 0;
57 }
2)使用數組
1 #include<iostream>
2 #include<algorithm>
3 #include<cstring>
4 using namespace std;
5 const int maxn = 200030;
6 int change(int x,int ch)
7 {///0為x-1,1為x+1,2為2*x
8 if(ch == 0)
9 return x-1;
10 if(ch == 1)
11 return x+1;
12 if(ch == 2)
13 return 2*x;
14 }
15
16 struct node{
17 int num;
18 int deep;
19 };
20 int visit[maxn];
21 node queue[maxn];
22 int main()
23 {
24 int n,k;
25 while(cin>>n>>k)
26 {
27 memset(visit,false,sizeof(visit));
28 queue[0].num = n;
29 queue[0].deep = 0;
30 visit[n] = true;
31 int head = 0;
32 int rear = 1;
33 while(head<rear)
34 {
35 int m = queue[head].num;
36 if(m==k)
37 {
38 cout<<queue[head].deep<<endl;
39 break;
40 }
41 for(int i=0;i<3;i++)
42 {
43 int temp = change(m,i);
44 if(temp>=0 && temp<=maxn && !visit[temp])///進行剪枝
45 {
46 queue[rear].num = temp;
47 queue[rear++].deep = queue[head].deep+1;
48 visit[temp] = true;
49 }
50 }
51 head++;
52 }
53 }
54 return 0;
55 }
POJ 3278 -- Catch That Cow