求x到y的最少计算次数 (BFS)

时间限制:1秒

空间限制:262144K

给定两个-100到100的整数x和y,对x只能进行加1,减1,乘2操作,问最少对x进行几次操作能得到y?
例如:
a=3,b=11: 可以通过3*2*2-1,3次操作得到11;
a=5,b=8:可以通过(5-1)*2,2次操作得到8;


输入描述:
输入以英文逗号分隔的两个数字,数字均在32位整数范围内。

输出描述:
输出一个数字

输入例子1:
3,11

输出例子1:
3

 

思路:广度优先搜索。(队列实现)

 1 #include <iostream>
 2 #include <queue>
 3 #include <cstdio>
 4 using namespace std;
 5 
 6 int main() {
 7     int x, y;
 8     int cnt = 0;
 9     bool flag = false;
10     scanf("%d,%d", &x, &y);
11     queue<int> q;
12     q.push(x);
13     while (!q.empty()) {
14         int len = q.size();
15         for (int i = 0; i < len; i++) {
16             int tmp = q.front();
17             q.pop();
18             if (tmp == y) {
19                 flag = true; 
20                 break;
21             } else {
22                 q.push(tmp + 1);
23                 q.push(tmp - 1);
24                 q.push(tmp * 2);
25             }
26         }
27         if (flag)
28             break;
29         cnt++;
30     }
31     cout << cnt << endl;
32     return 0;
33 }

 

 1 #include <iostream>
 2 #include <queue>
 3 #include <cstdio>
 4 using namespace std;
 5 
 6 int main() {
 7     int x, y;
 8     scanf("%d,%d", &x, &y);
 9     queue<pair<int, int> > q;
10     pair<int, int> tmp({x, 0});
11     q.push(tmp);
12     
13     while (!q.empty()) {
14         tmp = q.front();
15         q.pop();
16         if (tmp.first == y) {
17             cout << tmp.second << endl;
18             break;
19         } else {
20             q.push({tmp.first + 1, tmp.second + 1});
21             q.push({tmp.first - 1, tmp.second + 1});
22             q.push({tmp.first * 2, tmp.second + 1});
23         }
24     }
25     return 0;
26 }

 

posted @ 2019-09-04 09:21  琴影  阅读(1137)  评论(0编辑  收藏  举报