NYOJ306 走迷宮 dfs 二分搜尋

2021-12-29 23:55:51 字數 1694 閱讀 5416

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

這個迷宮可以向上走,向下走,向右走,向左走,但是不能穿越對角線。走迷宮的取勝規則很有意思,看誰能更快地找到一條路徑,其路徑上單元格最大難度值與最小難度值之差是最小的。當然了,或許這樣的路徑不是最短路徑。

機械人卡多現在在迷宮的左上角(第一行,第一列)而出口在迷宮的右下角(第n行,第n列)。

卡多很聰明,很快就找到了這樣的一條路徑。你能找到嗎?輸入

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

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

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

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

樣例輸入

51 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判斷對於當前範圍值是否能否從(1,1)到達(n,n)。如果能找到某一路徑到達(n,n),則證明當前答案能夠滿足要求,還可以繼續減小。我們可以二分[0,max-min]之間的值,進行判斷即可。

ac**:

/***@xiaoran

*dfs+二分搜尋

*迷宮可以向上走,向下走,向右走,向左走

*從(1,1)到(n,n)能否找到一條路徑,

*其路徑上單元格最大難度值與最小難度值之差是最小的

*/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using namespace std;

/** *minn:地圖中的最小值,

*maxn:地圖中的最大值,

*flag:標記差值在某個範圍內是否能夠到達(n,n)

*vmap:地圖

*vis[i][j]:該節點是否已被訪問

*dx,dy:搜尋四個方向

*/int n,minn,maxn,flag;

int vis[120][120],vmap[120][120];

int dx=,dy=;

void init()

}}/**

*差值在r-l的範圍內是否存在從(1,1)-->(n,n)的路徑

*這裡判斷的是每一值是否在[l,r]之間·

*/void dfs(int i,int j,int l,int r)

for(int k=0;k<4;k++)

}}/**

*用來判斷當差值為k時,是否滿足能夠找到從(1,1)-->(n,n)的路徑

*/int judge(int k)

return 0;

}int get_ans(){

int l=0,r=maxn-minn;

while(l

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直接實現,果不其...

nyoj306(二分 dfs 好題)

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