思路就是二分答案+bfs就是报MLE,难道java真不能拿来写题吗
import java.util.*;
public class Main {
static int x,y,tx,ty;
public static boolean check(int asd) {
nn[1]=1;mm[1]=1;
book[1][1]=1;
while(hard<tail) {
x=nn[hard];
y=mm[hard];
for(int i=0;i<4;i++) {
tx=x+next[i][0];
ty=y+next[i][1];
if(tx<1||tx>n||ty<1||ty>m) {
continue;
}
if(book[tx][ty]>0) {
continue;
}
if(a[tx][ty]>asd) {
continue;
}
if(tx==n) {
return true;
}
book[tx][ty]=1;
nn[tail]=tx;
mm[tail++]=ty;
}
hard++;
}
return false;
}
//初始化方法
public static void csh() {
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
book[i][j]=0;
}
}
hard=1;tail=2;
}
static Scanner scanner=new Scanner(System.in);
static int [][] next = { {0,1},{1,0},{0,-1},{-1,0} };
static int [][] a=new int [1011][1011];
static int [][] book=new int [1101][1101];
static int [] nn=new int [1010001];
static int [] mm=new int [1010001];
static int hard,tail;
static int n;
static int m;
static int min=1000,max=0;
static int ans;
static int mig;
public static void main(String[] args) {
n=scanner.nextInt();
m=scanner.nextInt();
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) {
a[i][j]=scanner.nextInt();
if(max<a[i][j]) {
max=a[i][j];
}
if(min>a[i][j]) {
min=a[i][j];
}
}
}
ans=max;
while(min<=max) {
csh();
mig=(min+max)/2;
if(check(mig)){
ans=mig;
max=mig-1;
}else{
min=mig+1;
}
}
System.out.println(ans);
}
}