- 本题#17报RE错,是因为栈溢出,查询了资料之后发现,java主线程分配的栈块太小,递归深度太大就会发生这种问题,我们写爆搜不可避免要在Tle和爆栈边缘徘徊,这也是和c++相比一个比较弱势的点,那么有没有方法解决这一弱点呢?朋友别慌,有的,都有的
- 笔者查了下资料,发现我们可以直接开一个子线程,然后自己设置栈的空间大小,这一问题就解决啦
- 上代码
package shuati;
import java.io.*;
import java.util.*;
public class Main implements Runnable{
static StreamTokenizer cin = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
static PrintWriter cout = new PrintWriter(new OutputStreamWriter(System.out));
static int n, m;
static final int N = (int) (1e3 + 10);
static int[][] g = new int[N][N];
static int[][] cnt = new int[N][N];
static boolean[][] str = new boolean[N][N];
static int[] dx = {1, 1, 0, -1, -1, -1, 0, 1};
static int[] dy = {0, 1, 1, 1, 0, -1, -1, -1};
static int ans;
public static void dfs(int x, int y) {
for (int i = 0; i < 8; i++) {
int nowx = dx[i] + x;
int nowy = dy[i] + y;
if(nowx >= 1 && nowx <= n && nowy >= 1 && nowy <= m) {
if(!str[nowx][nowy] && cnt[nowx][nowy] == 0 && g[nowx][nowy] == 0) {
str[nowx][nowy] = true;
dfs(nowx, nowy);
}
}
}
}
public static int solve(int x, int y) {
int num = 0;
for (int i = 0; i < 8; i++) {
int nowx = x + dx[i];
int nowy = y + dy[i];
if(nowx >= 1 && nowx <= n && nowy >= 1 && nowy <= m) {
if(cnt[nowx][nowy] == 0 && g[nowx][nowy] == 0){
num++;
break;
}
}
}
if(num == 1) return 0;
else return 1;
}
public static void main(String[] args) throws IOException {
new Thread(null, new Main(), "", 1 << 29).start();
}
@Override
public void run() {
try {
cin.nextToken();
n = (int) cin.nval;
cin.nextToken();
m = (int) cin.nval;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
cin.nextToken();
g[i][j] = (int) cin.nval;
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(g[i][j] == 0) {
int num = 0;
for (int k = 0; k < 8; k++) {
int nowx = i + dx[k];
int nowy = j + dy[k];
if(nowx >= 1 && nowx <= n && nowy >= 1 && nowy <= m) {
if(g[nowx][nowy] == 1) num++;
}
}
cnt[i][j] = num;
}
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(g[i][j] == 1) continue;
if(str[i][j]) continue;
if(cnt[i][j] == 0) {
str[i][j] = true;
dfs(i, j);
ans++;
continue;
}
int a = solve(i, j);
ans += a;
}
}
cout.println(ans);
cout.flush();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}