java选手#17报错RE的看这里
查看原帖
java选手#17报错RE的看这里
1158041
fater_ak楼主2025/1/24 15:25
  • 本题#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];
    /*
    cnt = 0 空格
    cnt = 数字 雷
     */
    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);
             }
          }
       }
    }

    /*
    是否统计进去, 统计周围8格全是数字或者雷的格子
     */
    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);
        }

    }
}
2025/1/24 15:25
加载中...