题目网址: POJ -- 3278ios
人的状态每次有三种变化方式可选,题目问的又是“最少”的步数,因此用宽度优先搜索(BFS)就能够解决。算法
由于一个点老是能在入队列的第一时间进入队列,因此在找到最终目标的时候用的步数是最少的。spa
在写宽搜算法的过程须要注意的一点就是“判重”,即入过队列的元素不可再次进入队列。 事实上,若是不在元素入队列的第一时间打上标记的话会有更严重的问题出现,内存溢出或者超时错误均可能因为没有判重致使。code
对于这道题目,不用担忧时间问题,由于每一个点只进入一次队列而且被处理一次,一共N个点,算法的复杂度不会超出O(N)的。队列
#include <cstdio> #include <queue> #include <cstring> #include <iostream> using namespace std; const int maxn = 100000; int dist[maxn+10]; queue<int> q; int bfs(int N, int K) { q.push(N); dist[N] = 0; while(!q.empty()) { int X = q.front(); q.pop(); if(X == K) return dist[X]; if(X-1 >= 0 && dist[X-1] < 0) { q.push(X-1); dist[X-1] = dist[X] + 1; } if(X+1 <= maxn && dist[X+1] < 0) { q.push(X+1); dist[X+1] = dist[X] + 1; } if(X*2 <= maxn && dist[X*2] < 0) { q.push(X*2); dist[X*2] = dist[X] + 1; } } return -1; /// 实际上不存在这种状况 } int main() { int N, K; cin >> N >> K; memset(dist, -1, sizeof(dist)); cout << bfs(N, K) << endl; return 0; }