M 災難預警 浙江農林大學天梯

2021-10-25 05:06:46 字數 2193 閱讀 1623

眾所周知,浙農林是一條河。

由於浙江農林大學的特殊地形,當你在下雨後漫步在農林大路上的時候

難免會出現一腳踩進乙個水坑的情況的情況。而農農非常不喜歡踩到水坑的感覺,

請你幫忙設計乙個程式來幫助農農判斷他能否在不踩入水坑的情況下回到

寢室。已知,浙江農林大學可以表示為乙個 n * n 的矩陣。

對於每個位置有乙個海拔資料 h[i][j],當水位高度大於 h[i][j] 的時候,

這個位置就會形成乙個水坑。

農農現在的座標是 (1, 1), 他的宿舍位於 (n, n).

農農只可以沿著上下左右四個方向走。

假如農農現在位於 (2, 2)那麼在不考慮水位的情況下,他可以去的地方有

(1, 2),(2,1), (3, 2) ,(2, 3)

n (表示矩陣大小)

接下來 n 行為乙個 n * n 的矩陣 h

q (表示詢問數量)

接下來 q 行每行乙個數字,表示當前水位 x

1 <= n <= 1000

1 <= h[i][j] <= 100000

1 <= x <= 100000

1 <= q <= 100000

共 q 行,表示在對應水位下,農農能否在不踩入水坑的情況下

回到寢室, 如果農農可以回到寢室,請你輸出「wuhu」, 反之請輸出

「hmmm」

4

5 2 3 2

4 5 3 4

2 1 4 5

3 3 3 321

5wuhu

hmmm

對於第一次詢問,沒有任何乙個位置形成水坑,所以農農可以從(1, 1)走到(4, 4)

對於第二次詢問 高度小於 5 的位置形成了水坑,其中包括目的地 (4, 4)所以農農無法在

不踩到水坑的情況下走到(4, 4)

1000*1000的圖,1e5次查詢,顯然不能每次都dfs。先二分計算出能從(1,1)走到(n,n)的最高水位高度,然後o(1)查詢輸出即可

#include

using

namespace std;

#define ll long long

const

int n=

1e3+10;

const ll mod=

1e9+7;

int t;

int a[n]

[n];

bool vis[n]

[n];

int n;

int f;

void

dfs(

int x,

int y,

int d)

if(x<

1||x>n||y<

1||y>n)

return;if

(a[x+1]

[y]>=d&&

!vis[x+1]

[y])vis[x+1]

[y]=1,

dfs(x+

1,y,d);if

(a[x-1]

[y]>=d&&

!vis[x-1]

[y])vis[x-1]

[y]=1,

dfs(x-

1,y,d);if

(a[x]

[y+1

]>=d&&

!vis[x]

[y+1

])vis[x]

[y+1]=

1,dfs(x,y+

1,d);if

(a[x]

[y-1

]>=d&&

!vis[x]

[y-1

])vis[x]

[y-1]=

1,dfs(x,y-

1,d);}

bool

check

(int x)

if(f)

return1;

return0;

}int

main()

int l=

0,r=mx;

while

(l<=r)

else

}//cout("%d"

,&t)

;while

(t--

)return0;

}