链接:https://ac.nowcoder.com/acm/problem/213267
来源:牛客网
题意:
对一个 N * N 的矩阵,每个位置有一个海拔数据 h[i][j],
当水位高度大于 h[i][j] 的时候, 这个位置就会形成一个水坑,不能通过。
q次询问,每次一个水位x,问能不能从(1,1)走到(n,n)
思路:
暴搜会T,直接排除,只能二分了,时间复杂度
O
(
l
o
g
10
n
)
O(log_{10}n)
O(log10n)
二分查找能从(1,1)走到(n,n)的水位的最大值ans,对于每个二分值,dfs一下,判断能否走到(n,n)
然后对每次询问,如果水位小于等于ans,就能通过,否则不能
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e3+10;
int n,mp[maxn][maxn],q,vis[maxn][maxn],x,ans;
void dfs(int x,int y,int h) {
if(x<1 || x>n || y<1 || y>n || mp[x][y]<h || vis[x][y]) return;
vis[x][y]=1;
dfs(x+1,y,h);
dfs(x-1,y,h);
dfs(x,y+1,h);
dfs(x,y-1,h);
}
int main() {
cin>>n;
for(int i=1; i<=n; i++) {
for(int j=1; j<=n; j++) {
cin>>mp[i][j];
}
}
int l=1,r=1e5+10,mid;
while(l<=r) {
mid=(l+r)>>1;
memset(vis,0,sizeof(vis));
dfs(1,1,mid);
if(vis[n][n]) {
ans=mid;
l=mid+1;
} else r=mid-1;
}
cin>>q;
while(q--) {
cin>>x;
cout<<(x>ans ? "Hmmm" : "Wuhu")<<endl;
}
}