9.20度小满第二个编程

在交卷之后做出来了。。。
dfs只能通过9%,因为普通'.'格子是不计算步数的。
package duxiaoman;

import org.omg.CORBA.INTERNAL;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;

public class Main2 {
    static int[] dx = {1,0,-1,0};
    static int[] dy = {0,1,0,-1};
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(reader.readLine());
        for (int i = 0; i < n; i++) {
            String[] s = reader.readLine().split(" ");
            int l0 = Integer.parseInt(s[0]);
            int l1 = Integer.parseInt(s[1]);
            int[][] map = new int[l0][l1];
            int[][] dis = new int[l0][l1];
            int[] start = new int[2];
            for (int j = 0; j < map.length; j++) {
                String str = reader.readLine();
                for (int k = 0; k < str.length(); k++) {
                    char c = str.charAt(k);
                    if (c == '#'){
                        map[j][k] = 3;
                    }else if (c == '*'){
                        map[j][k] = 1;
                    }else if (c == '.'){
                        map[j][k] = 0;
                    }else if (c == '@'){
                        start[0] = j;
                        start[1] = k;
                    }
                    dis[j][k] = Integer.MAX_VALUE;
                }
            }
            dis[start[0]][start[1]] = 0;
            map[start[0]][start[1]] = 0;
            boolean[][] flag = new boolean[l0][l1];
            flag[start[0]][start[1]] = true;
            while (true){
                int sum0 = zou0(map,flag,dis);
                int sum1 = zou1(map,flag,dis);
                if (sum0 + sum1 == 0) {
                    break;
                }
            }

            int res = Integer.MAX_VALUE;
            for (int j = 0; j < l1; j++) {
                int t = Math.min(dis[0][j],dis[l0-1][j]);
                if (t < res){
                    res = t;
                }
            }
            for (int j = 0; j < l0; j++) {
                int t = Math.min(dis[j][0],dis[j][l0-1]);
                if (t < res){
                    res = t;
                }
            }
            if (res == Integer.MAX_VALUE){
                System.out.println(-1);
            }else {
                System.out.println(res);
            }

        }
    }
    public static int zou0(int[][] map,boolean[][] flag,int[][] dis){
        int c = 0;
        for (int i = 0; i < map.length; i++) {
            for (int j = 0; j < map[0].length; j++) {
                if (map[i][j] == 0 && !flag[i][j]){
                    for (int k = 0; k <4; k++) {
                        int tx = i + dx[k];
                        int ty = j + dy[k];
                        if (tx >= 0 && tx < map.length && ty >= 0 && ty < map[1].length && flag[tx][ty]){
                            dis[i][j] = dis[tx][ty];
                            flag[i][j] = true;
                            c++;
                        }
                    }
                }
            }
        }
        return c;
    }
    public static int zou1(int[][] map,boolean[][] flag,int[][] dis){
        int c = 0;
        for (int i = 0; i < map.length; i++) {
            for (int j = 0; j < map[0].length; j++) {
                if (map[i][j] == 1 && !flag[i][j]){
                    for (int k = 0; k <4; k++) {
                        int tx = i + dx[k];
                        int ty = j + dy[k];
                        if (tx >= 0 && tx < map.length && ty >= 0 && ty < map[1].length && flag[tx][ty]){
                            dis[i][j] = dis[tx][ty] + 1;
                            flag[i][j] = true;
                            c++;
                        }
                    }
                }
            }
        }
        return c;
    }
}

/*
1
3 4
####
#@.* **.*
*/


#笔试题目##度小满#
全部评论
我也9%,超时了,估计得优化才能过
点赞 回复 分享
发布于 2020-09-20 22:06
小昆虫那个题
点赞 回复 分享
发布于 2020-09-20 21:47

相关推荐

不愿透露姓名的神秘牛友
昨天 12:31
以前小时候我最痛恨出轨、偷情的人,无论男女,为什么会出轨?现在我成了自己最讨厌的人,没想到分享的东西在牛客会被这么多人看,大家的评价都很中肯,我也认同,想过一一回复,但我还是收声了,我想我应该说说这件事,这件事一直压在我心里,是个很大的心结,上面说了人为什么出轨,我大概能明白了。我们大一下半年开始恋爱,开始恋爱,我给出了我铭记3年的承诺,我对她好一辈子,我永远不会背叛,我责任心太重,我觉得跟了我,我就要照顾她一辈子,我们在一起3年我都没有碰过她,她说往东我就往东,她说什么我做什么,她要我干什么,我就干什么!在学校很美好,中途也出过一些小插曲,比如男闺蜜、男闺蜜2号等等等。但我都强迫她改掉了,我...
牛客刘北:两个缺爱的人是没有办法好好在一起的,但世界上哪有什么是非对错?你后悔你们在一起了,但是刚刚在一起的美好也是真的呀,因为其他人的出现,你开始想要了最开始的自己,你的确对不起自己,21岁的你望高物远,你完全可以不谈恋爱,去过你想要的生活,你向往自由,在一起之后,你要想的不是一个人,而是两个人,你不是变心了,就像你说的,你受够了,你不想包容了,冷静几天是你最优的选择,爱人先爱己。
社会教会你的第一课
点赞 评论 收藏
分享
06-02 15:53
阳光学院 Java
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务