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