題意:從(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的方陣給出 方陣中 單元格...