JAVA 数组代替QUEUE版
因为开辟数组,new的操作花费的代价系数接近100 所以这并不是一种好办法,使用java.util.LinkedList;
来实现Queue接口更好,内部会有优化哦。但是我比较懒啦,。。值得注意的是,在java中不能像 c/c++ 一样使用&,在JAVA中int等基本数据类型是值传递,故此将bund和land放到方法内部比较方便,当然将他们放到全局静态区也行
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main { // flood fill
//n = 10^3 共 10^6 个输入
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static final int N = 1010;
static int n, res;
static char g[][] = new char[N][N];
static boolean st[][] = new boolean[N][N];
static int q[][] = new int[N * N][2];
static int dx[] = {-1, 0, 1, 0};
static int dy[] = {0, 1, 0, -1};
static boolean bfs(int[] start) {
int front = 0, rear = 0;
q[0] = start; //起点入队
int land = 0, bund = 0;
while (front <= rear) {
int[] t = q[front ++ ];
st[t[0]][t[1]] = true; //标记访问过
boolean is_bund = false;
for (int i = 0; i < 4; i++) {
int x = t[0] + dx[i], y = t[1] + dy[i];
if(x < 0 || x >= n || y < 0 || y >= n) continue;
if(st[x][y]) continue;
if(g[x][y] == '.') {
is_bund = true;
continue;
}
land ++ ;
q[++ rear] = new int[] {x, y}; //拓展队列
}
if (is_bund) bund ++ ;
}
return land == bund;
}
public static void main(String[] args) throws NumberFormatException, IOException {
n = Integer.parseInt(in.readLine());
for (int i = 0; i < n; i++) {
g[i] = in.readLine().toCharArray();
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (!st[i][j] && g[i][j] == '#') {
if(bfs(new int[] {i, j})) res ++ ;
}
}
}
System.out.println(res);
}
}
欢迎点评hhh
码风不错
new操作的时间开销比Queue接口还大吗
把这个q[]放到bfs里面,就超时了,坑死我了。
hh
为什么呀,我改成静态数组果然过了
java语法基础,值类型传递的是新副本,引用类型传递的是引用,值类型写成静态字段,等价于所有读取都是读的同一份地址,等价于传递引用