1. 程式人生 > >洛谷P1588 丟失的牛

洛谷P1588 丟失的牛

button names ont tin 線上 primary ios 追上 提供者

P1588 丟失的牛

    • 158通過
    • 654提交
  • 題目提供者JOHNKRAM
  • 標簽USACO
  • 難度普及/提高-
  • 時空限制1s / 128MB

討論 題解

最新討論更多討論

  • 答案下載下來是對的,但過不…
  • 此題卡stl的queue?
  • 假的編譯器。。。
  • 怎麽A不了

題目描述

FJ丟失了他的一頭牛,他決定追回他的牛。已知FJ和牛在一條直線上,初始位置分別為x和y,假定牛在原地不動。FJ的行走方式很特別:他每一次可以前進一步、後退一步或者直接走到2*x的位置。計算他至少需要幾步追上他的牛。

輸入輸出格式

輸入格式:

第一行為一個整數t(≤10),表示數據組數;接下來每行包含一個兩個正整數x和y(x,y≤10^5),分別表示FJ和牛的坐標。

輸出格式:

對於每組數據,輸出最少步數。

輸入輸出樣例

輸入樣例#1:
1 
5 17
輸出樣例#1: 4
分析:這道題使我更深刻的理解了dfs和bfs的區別,直接dfs是不行的,因為一條道走到黑,而且不能確保步數最少,所以用bfs,這樣每擴展一步都是步數最少的,這樣的話還要加上剪枝:1.如果走到負數就不要-1了 2.如果大於y就不增加了。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#include 
<stack> #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <string> using namespace std; int t, x, y,d[1000100]; int main() { scanf("%d", &t); while (t--) { scanf("%d%d", &x, &y); memset(d,
0, sizeof(d)); queue <int> q; q.push(x); while (!q.empty()) { int t = q.front(); q.pop(); if (t == y) { printf("%d\n", d[t]); break; } if (t - 1 > 0 && (!d[t - 1] || d[t - 1] > d[t] + 1)) { d[t - 1] = d[t] + 1; q.push(t - 1); } if (t >= y) continue; if ( 2 * t < 1000100 && (!d[2*t] || d[2*t] > d[t] + 1)) { d[2*t] = d[t] + 1; q.push(2*t); } if (t + 1 < 1000100 && (!d[t + 1] || d[t + 1] > d[t] + 1)) { d[t + 1] = d[t] + 1; q.push(t + 1); } } } return 0; }

 

洛谷P1588 丟失的牛