题意:给定一个矩阵,从左上角到右下角,使走过的路径中数字的最大值最小值之差最小,问差最小是多少.
分析:二分枚举差值,枚举下界,bfs判定可行性.
code:
type mapnode=record
x,y:longint;
end;
var fx:array[1..4,0..1] of longint=((0,1),(0,-1),(-1,0),(1,0));
tall:array[0..101,0..101] of longint;
vis:array[0..101,0..101] of boolean;
q:array[0..10000] of mapnode;
n,i,j,l,r,mid,maxh,minh,hx:longint;
flag:boolean;
function check(i,j,ll,rr:longint):boolean;
begin
if (tall[i,j]>=ll)and(tall[i,j]<=rr) then exit(true);
exit(false);
end;
function bfs(ll,rr:longint):boolean;
var h,t,o,x,y:longint;
begin
if not check(1,1,ll,rr) then exit(false);
fillchar(vis,sizeof(vis),0);
h:=0; t:=1;
q[1].x:=1;
q[1].y:=1;
vis[1,1]:=true;
while h<t do
begin
inc(h);
for o:=1 to 4 do
begin
x:=q[h].x+fx[o,0];
y:=q[h].y+fx[o,1];
if not check(x,y,ll,rr) then continue;
if (x>0)and(x<=n)and(y>0)and(y<=n)and(not vis[x,y]) then
begin
inc(t);
q[t].x:=x;
q[t].y:=y;
vis[x,y]:=true;
if (x=n)and(y=n) then exit(true);
end;
end;
end;
exit(false);
end;
begin
readln(n);
minh:=0; maxh:=0;
for i:=1 to n do
begin
for j:=1 to n do
begin
read(tall[i,j]);
if tall[i,j]>maxh then maxh:=tall[i,j];
end;
readln;
end;
l:=minh; r:=maxh;
while l<r do
begin
mid:=(l+r)>>1;
flag:=false;
for hx:=minh to maxh-mid do
if Bfs(hx,hx+mid) then
begin
flag:=true;
break;
end;
if flag then r:=mid
else l:=mid+1;
end;
writeln(l);
end.