📄 3156243_wa.cc
字号:
#include <stdio.h>
#include <string.h>
int n;
int height[201][201];
int valid(int i,int j)
{
return i >= 0 && j >= 0 && i < n && j < n;
}
int mov[][2] = {{0,1},{0,-1},{1,0},{-1,0}};
int iabs(int num)
{
return num > 0 ? num : -num;
}
int que[200001][2];int max[200001], min[200001];
int can(int h)
{
int visited[201][201];
int f, r, i;
int x, y;
f = r = -1;
++r;
que[0][0] = 0;
que[0][1] = 0;
max[0] = min[0] = height[0][0];
memset(visited,0,sizeof(visited));
visited[0][0] = 1;
while(f!=r)
{
if(r > 200000)
while(1);
++f;
for(i = 0; i < 4; i++)
{
x = que[f][0]+mov[i][0];
y = que[f][1]+mov[i][1];
if(valid(x,y)==0||iabs(height[x][y]-max[f])>h||iabs(height[x][y]-min[f])>h)
{
continue;
}
if(visited[x][y] < 10)
{
if(x==n-1&&y==n-1)
return 1;
++r;
que[r][0] = x;
que[r][1] = y;
max[r] = max[f] > height[x][y] ? max[f] : height[x][y];
min[r] = min[f] < height[x][y] ? min[f] : height[x][y];
visited[x][y]++;
}
}
}
return 0;
}
int main()
{
int i, j;
int min, max, mid;
scanf("%d",&n);
for(i = 0; i < n; i++)
{
for(j = 0; j < n; j++)
{
scanf("%d",&height[i][j]);
}
}
min = 0;max = 110;
while(min < max)
{
mid = (min+max)>>1;
if(can(mid))
max = mid;
else
min = mid+1;
}
printf("%d\n",min);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -