求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;
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 }
越努力,越幸运