题目见链接:原题
大致题意:
给定两个整数n和k
通过 n+1或n-1 或n*2 这3种操作,使得n==k
输出最少的操作次数
解题思路:
用BFS遍历,只需得到一个最小解就行。
注意的地方:
1 剪枝。直接广搜一样等着RE吧= = ,判断下一步是否超出边界,即大于100000或者小于0,否则RE。
BFS有固定的解题思路:
定义一个队列,然后取队头元素,从队头周围开始搜索,搜索结果入队,别忘记了rear指针和front指针加1。一直循环以上操作,直到rear < =front。
BFS最重要的是对边界的判断,否则容易超时或错误。
#include <iostream> using namespace std; const int MAXSIZE = 100005;// 数组大小 int visit[MAXSIZE]; // 标记数组 int N, K; int head; typedef struct{ int step; int x; }Point; typedef struct{ Point val[MAXSIZE]; int front; int rear; }Queue; // 定义一个队列 int bfs(int start) { Queue queue = {{0}, 0, 0}; queue.val[0].step = 0; // 起始元素入队 queue.val[0].x = start; queue.rear++; visit[queue.val[0].x] = 1; int next; while(queue.rear > queue.front) { head = queue.val[queue.front].x; // 取队头元素 for(int i = 0; i < 3; i++) { if(i == 0) { next = head - 1; } else if(i == 1) next = head + 1; else next = 2 * head; if(next > 100000 || next < 0) continue; // 边界判断 if(!visit[next]) { queue.val[queue.rear].x = next; queue.val[queue.rear].step = queue.val[queue.front].step + 1; queue.rear ++; visit[next] = 1; } if(next == K) // 终止条件判断 { return queue.val[queue.rear - 1].step; } } queue.front++; // 千万别忘记头指针加一,血的教训 } return 0; } int main() { while(cin>>N>>K) { memset(visit,0,sizeof(visit)); if(N == K) { cout << 0 << endl; } else{ cout << bfs(N) << endl; } } return 0; }