题目链接
这个我原来用Scanner方法读入数据,两个测试点超限,用了StreamTokenizer全部ac
import java.util.*;
import java.math.*;
import java.io.*;
public class Main {
public static int r,c,map[][],is[][];
public static int dx[]={1,1,-1,-1,0,0,1,-1};
public static int dy[]={-1,1,-1,1,1,-1,0,0};
public static void main(String[] args)throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer sc=new StreamTokenizer(br);
sc.nextToken();
r=(int)sc.nval;
sc.nextToken();
c=(int)sc.nval;
map=new int[r][c];
is=new int[r][c];
dian[] d=new dian[r*c];
for(int i=0;i<r;i++)
for(int j=0;j<c;j++){
sc.nextToken();
int h=(int)sc.nval;
map[i][j]=h;
d[i*c+j]=new dian(i,j,h);
}
Arrays.sort(d,new Comparator<dian>(){
public int compare(dian o1,dian o2){
return o2.h-o1.h;
}
});
int ans=0;
for(int i=0;i<r*c;i++){
if(is[d[i].x][d[i].y]==1)
continue;
dfs(d[i].x,d[i].y);
ans++;
}
System.out.println(ans);
}
public static void dfs(int x,int y){
int cur=map[x][y];
is[x][y]=1;
for(int i=0;i<8;i++){
int xx=x+dx[i];
int yy=y+dy[i];
if(xx<0||yy<0||xx==r||yy==c||map[xx][yy]>cur||is[xx][yy]==1)
continue;
dfs(xx,yy);
}
}
}
class dian{
int x,y,h;
public dian(int a,int b,int c){
x=a;
y=b;
h=c;
}
}