NYOJ 306 走迷宮 二分 搜尋

2021-06-11 12:56:00 字數 1285 閱讀 6101

題意:從(1,1)點到(n,n)找一條路徑(只能上下左右走),使路徑上最大點與最小點差值最小。。

思路分析:

(1):這題和我們以前做的迷宮題差別很大,以前做的一般就是求 最小步數或代價最小,乙個dfs或bfs即可,而此題是求最大點與最小點差。

(2):分析看出,一次dfs和bfs對我等弱菜來說顯然不可(大牛或許可以)。

(3):若直接搜尋,那些點該搜,那些點不該搜,顯然是沒法進行……

(4):看資料範圍值在結果就在 (0,120 )之間,我們就可假設乙個當前答案搜尋!!不斷更新。。

(5):根據輸入的迷宮各點值 ,我們可以找出最大值 mmax 和最小值 mmin,若當前答案是0 ,那要最多要搜尋mmax-0 -mmin次,

第一次可以搜的點值區間在(mmin,mmin+0);看是否能找出路……若不能,下次可以搜尋的點值區間在(min+1,mmin+0+1);看是否能找出路徑,……若不能,下次可以搜尋點值區間在(min+2,min+0+2)……直到最後一次可搜尋的點值區間是(mmax-0,mmax)……;在每次搜尋中的,只要一次能搜到路徑,即說明當前答案是可行的。。特別注意::該當前答案搜出的滿足該答案的路徑 是最大值和最小值差在 當前答案內!!並不是差就是當前答案。。 

(6):可以先求出mmax,mmin,得到答案範圍,(0,mmax-mmin);可以先假設當前答案是 mmax-mmin 依次向0 搜尋,中間搜不出滿足當前答案的路徑,那麼正確答案就出來了!!即當前 答案+1。若能就一直向前搜尋,直到 -1。

(7):(6)中的方法對於弱資料是可以ac的。。但是有沒有更高效率思路??看(6)中每次搜尋的當前答案,是線性的!!,那麼就可以用 二分 來列舉當前答案,時間複雜度 log(mmax-mmin)不就更快了……

ac**:

#include#include#includeusing namespace std;

int map[150][150],mmax,mmin,flag;

int n,sx=,zy=;

int loop[150][150];

void init()

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

int i,j;

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

}}bool find(int k)

return false;

}int find_answer()

else

x=mid+1;

}return y;

}int main()

}

NYOJ306 走迷宮 dfs 二分搜尋

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

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的方陣給出 方陣中 單元格...