nyoj 306 走迷宮 二分法 dfs

2021-07-04 18:03:16 字數 1365 閱讀 4795

限制 描述

輸入 輸出

樣例輸入

5

1 1 3 6 8

1 2 2 5 5

4 4 0 3 3

8 0 2 3 4

4 3 0 2 1

樣例輸出
2
分析

題意是要為僅能上、下、左、右行動的機器找出一條從左上角到右下角的路徑,並且這條路徑上的最大值和最小值之差要最小。

看到題目,先是用dfs直接實現,果不其然tle。又是看了幾遍題目後發現,難度的區間已給出:[0, 120],若用二分的話感覺會優化不少時間,但是應該也要幾百ms。以防萬一我去查了一下其他人的執行時間發現大都只有不到100ms,以為演算法錯了。浪費了好多時間和本來就不多的腦細胞,實在想不出其他較好的方法,就上網查了一下,發現竟然都是二分+dfs,於是敲碼後提交,果然只有16ms…

可能本題的資料比較水,但還是應該「實踐出真知」

二分法需要細心設計一下,附上**:

/*

* nyoj. 306

* date: 2015.8.21

* 16sm 656kb

*/#include

#include

#include

#define max(a,b) a>b ? a : b

#define min(a,b) ausing

namespace

std;

const

int inf = 100000000;

const

int maxl = 110;

const

int direction[4][2] = ;

int arr[maxl][maxl], visited[maxl][maxl];

int n

, tempmindif, tempmaxdif // 當前根據二分法確定的最小值、最

, mindif, maxdif; // 大值整個輸入的最小值、最大值

bool inscale(int x, int y)

bool dfs(int x, int y)

}return

false;

}bool findpath(int key)

return

false;

}int main()

}int bsmid, bsleft = 0, bsright = maxdif - mindif;

while (bsleft <= bsright)

printf("%d\n", bsleft);

}return

0;}

NYOJ 306 走迷宮 二分 搜尋

題意 從 1,1 點到 n,n 找一條路徑 只能上下左右走 使路徑上最大點與最小點差值最小。思路分析 1 這題和我們以前做的迷宮題差別很大,以前做的一般就是求 最小步數或代價最小,乙個dfs或bfs即可,而此題是求最大點與最小點差。2 分析看出,一次dfs和bfs對我等弱菜來說顯然不可 大牛或許可以...

NYOJ306 走迷宮 dfs 二分搜尋

dr.kong設計的機械人卡多非常愛玩,它常常偷偷跑出實驗室,在某個遊樂場玩之不疲。這天卡多又跑出來了,在sjtl遊樂場玩個不停,坐完碰碰車,又玩滑滑梯,這時卡多又走入乙個迷宮。整個迷宮是用乙個n n的方陣給出,方陣中單元格中填充了乙個整數,表示走到這個位置的難度。這個迷宮可以向上走,向下走,向右走...

nyoj306(二分 dfs 好題)

時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 dr.kong設計的機械人卡多非常愛玩,它常常偷偷跑出實驗室,在某個遊樂場玩之不疲。這天卡多又跑出來了,在sjtl遊樂場玩個不停,坐完碰碰車,又玩滑滑梯,這時卡多又走入乙個迷宮。整個迷宮是 用乙個n n的方陣給出 方陣中 單元格...