nyoj306(二分 dfs 好題)

2021-07-11 02:24:18 字數 1566 閱讀 3022

時間限制:

1000 ms  |  記憶體限制:

65535 kb

難度:5 描述

dr.kong設計的機械人卡多非常愛玩,它常常偷偷跑出實驗室,在某個遊樂場玩之不疲。這天卡多又跑出來了,在sjtl遊樂場玩個不停,坐完碰碰車,又玩滑滑梯,這時卡多又走入乙個迷宮。

整個迷宮是

用乙個n 

*n的方陣給出

,方陣中

單元格中

填充了乙個整數

,表示走到這個位置的難度。

這個迷宮

可以向上走,向下走,向右走,向左走,但是不能穿越對角線。

走迷宮的取勝規則很有意思,

看誰能更快地找到一

條路徑,其路徑上單元格最大難度值與最小難度值之差是最小的。當然了,

或許這樣的路徑

不是最短路徑。

機械人卡多

現在在迷宮

的左上角(第一行,第一列)而出口在

迷宮的右下角(第n行,第n列)

卡多很聰明,很快就找到了

這樣的一條路徑

。你能找到嗎?

輸入

有多組測試資料,以eof為輸入結束的標誌

第一行: n 表示迷宮是n*n方陣 (2≤ n≤ 100)

接下來有n行, 每一行包含n個整數,用來表示每個單元格中難度 (0≤任意難度≤120)。

輸出輸出為乙個整數,表示路徑上最高難度與和最低難度的差。

樣例輸入

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

解體思路:先求出地圖中最大的難度值與最小的難度值,那麼我們知道我們所要求的答案就在[0,max-min]中,那麼自然想到了二分查詢答案。這樣就大大節省時間了。

**如下:

#include#include#define inf 0x3f3f3f3f

int map[110][110];

int mi,mx;

int vist[110][110];

int ok,n;

int d[4][2]=,,,};

bool check(int x,int y)

void dfs(int x,int y,int l,int r)

for(int i=0;i<4;i++) }}

int slove(int dis)

return 0;

}int main(){

int i,j;

while(scanf("%d",&n)!=eof){

mx=-1;mi=inf;

for(i=1;i<=n;i++){

for(j=1;j<=n;j++){

scanf("%d",&map[i][j]);

if(map[i][j]>mx)mx=map[i][j];

if(map[i][j]

NYOJ306 走迷宮 dfs 二分搜尋

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

NYOJ 306 走迷宮 二分 搜尋

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

nyoj 306 走迷宮 二分法 dfs

限制 描述 輸入 輸出 樣例輸入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直接實現,果不其...