POJ_3278_(BFS)
POJ 3278
总是想着用dfs做,不知道为什么
- 标记已经进入队列的点, 遇到
k
就存ans = step
输出
- 用dfs做的时候,根本没有办法控制
dfs
的范围,这里bfs
刚好解决了x-1 x+1 2*x
谁先到k
的问题 体现了广度优先的思想
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| #include <iostream> #include <string.h> #include <queue>
using namespace std; const int maxn = 1e5+1;
int n,k; int ans; bool vis[maxn];
struct node { int x; int step; node () {} node (int a,int b) { x = a; step = b; } }; queue<node> que;
void bfs() { node t(n,0); que.push(t); vis[n] = 1; while (!que.empty()) { node cur = que.front(); que.pop(); int x = cur.x; int nstep = cur.step+1; if (x == k) { ans = cur.step; return ; } if ((x-1 >= 0 && x-1 < maxn) && !vis[x-1]) { vis[x-1] = 1; node t(x-1,nstep); que.push(t); } if ((x+1 >= 0 && x+1 < maxn) && !vis[x+1]) { vis[x+1] = 1; node t(x+1,nstep); que.push(t); } if ((2*x >=0 && 2*x < maxn) && !vis[2*x]) { vis[2*x] = 1; node t(2*x,nstep); que.push(t); } } return ; }
int main() { cin >> n >> k; bfs(); cout << ans << endl; return 0; }
|