http://oj.jxust.edu.cn/contest/problem?id=1563&pid=4
題目描述
公元9012年,Q博士發明了一部太空電梯,與一般電梯不同,太空電梯不能直接到達目點。太空電梯只有上升和下降兩個按鍵,如果電梯上升,
它只能上升當前高度的距離;如果下降,它一次只能下降1米的距離。
為了使大家都能上太空去玩耍,Q博士想請你根據電梯的工作原理,計算到達目的點最少需要按幾次按鍵
輸入
多組輸入
每組輸入有兩個數n和m(1<=n,m<=10^7),表示當前高度n和目的點m
輸出
輸出計算結果
樣例輸入
4 6
10 1
255 999999
樣例輸出
2
9
28
題意:電梯有兩個按鈕 , 一個是上升目前高度的按鈕 , 另一個是下降1個高度的按鈕。
如何從起始高度到達目標高度並要求求出按最少次按鈕的次數。
我一開始想的是用dfs,我就去看了下分別在什么情況下使用dfs和bfs。
dfs特點:可以不重不漏的枚舉所有可以到達目標狀態的路徑。(回溯思想 , 枚舉思想)
bfs特點:效率較高,適合於找一條最快到達目標狀態的路徑。(發散思想)
//#include <bits/stdc++.h> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <algorithm> #include <iostream> #include <cstdio> #include <string> #include <cstring> #include <stdio.h> #include <queue> #include <stack> #include <map> #include <set> #include <string.h> #include <vector> #define ME(x , y) memset(x , y , sizeof(x)) #define SF(n) scanf("%d" , &n) #define rep(i , n) for(int i = 0 ; i < n ; i ++) #define INF 0x3f3f3f3f #define mod 1000000007 using namespace std; typedef long long ll ; int n , m ; int vis[100000009] , ans[100000009]; int bfs() { queue<int>q; vis[n] = 1 ; q.push(n); if(m % 2 == 1) { m++ ; ans[m]++; } while(!q.empty()) { int x = q.front(); q.pop(); if(x == m) { return ans[m]; } if(x*2 <= m && !vis[x*2]) { vis[2*x] = 1 ; ans[2*x] += ans[x] + 1 ; q.push(2*x); } if(x - 1 > 0 && !vis[x-1]) { vis[x-1] = 1 ; ans[x-1] += ans[x] + 1 ; q.push(x-1); } } } int main() { while(~scanf("%d%d" , &n ,&m)) { memset(ans, 0 , sizeof(ans)); memset(vis , 0 , sizeof(vis)); if(n < m) cout << bfs() << endl ; else { cout << n - m << endl ; } } return 0 ; }
刷題后感:標記查找過的點是bfs 和 dfs 的重要部分。