题目链接:传送门
思路:
因为数据ai不大,所以可以二分枚举差值;
然后枚举左端点,判断当前区间是否找到一条合适的路径。
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 120;
int a[N][N],n;
bool vis[N][N];
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
void dfs(int x,int y,int mi,int mx)
{
vis[x][y] = true;
for(int i=0;i<4;i++){
int tx = x + dx[i];
int ty = y + dy[i];
if(1<=tx&&tx<=n && 1<=ty&&ty<=n && vis[tx][ty] == false
&& mi<=a[tx][ty] && a[tx][ty]<=mx)
{
dfs(tx,ty,mi,mx);
}
}
}
int main(void)
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) cin>>a[i][j];
int l = 0,r = 3005,ans = 0;
while(l<=r){
int mid = (l+r)>>1;
bool fg = false;
for(int L=0;L+mid<=3005;L++){
if(a[1][1]<L || a[1][1]>(L+mid)) continue;
memset(vis,false,sizeof vis);
dfs(1,1,L,L+mid);
if(vis[n][n] == true){
fg = true;break;
}
}
if(fg == true){
ans = mid;
r = mid-1;
}
else{
l = mid+1;
}
}
cout<<ans<<endl;
return 0;
}