白駿16236草?


https://www.acmicpc.net/problem/16236

小さなサメ


n*nは行列を与え,サメの位置から魚を探す問題からbfsで解決すべきであると考えられる.
最初はいつものようにbfsを使って解答しましたが、満たす条件が多くて厳しいので、ますます山に登っているような気がします.
だからすべてのコードを削除して、最初から考え直します.
コアは現在のサメの位置で食べられる魚を見つける最短距離です。

これが私が考え直した結論です.
最初にbfsで食べられる魚を見つけてから次の魚を探すだけなら、問題は最短距離で、距離が同じなら条件が付いているので正解が見つからない.
だから簡単に条件を整理すると.
  • に入力された値に9が見つかり、サメの位置を個別の変数に格納します.(sX, sY)
  • より多くの魚が見つからない前に探索するのでwhileゲート内でbfsを開始します.
  • bfsが開始される前に、while文で最小値を格納する変数を初期化します.(minX, minY, minDist, visit[][])
    3-1. 理由は魚を見つけた後、その位置から食べ物を探し直すので、すべて初期化します.
    3-2. したがって初期化する前にminx,minyの値でサメの位置を変更します.
  • bfs内部ですべての座標をレビューし、条件を満たすとminx、minyなどを更新します.visit[]の値を移動する前に、位置からの値を1に更新すると、アクセスチェックも同時に実行できます.
  • のすべての座標の探索が終了すると、サメが成長できるかどうかを確認し、ansに時間を費やします.
  • コードは上記のように実行すべきだと思います.
    条件がたくさんあるので、実施しにくいです.実際、問題を解く時に困難にぶつかって、いくつかのヒントを見て問題を解くしかありません.
    これらの応用を解決し、問題を深化させるのに十分な基礎がないと思います.だから、基礎概念の問題を第一に考え、解決したいと思います.
    import java.io.*;
    import java.util.LinkedList;
    import java.util.Queue;
    
    public class Main {
        static int[] dx = {0, 0, -1, 1};
        static int[] dy = {1, -1, 0, 0};
        static int visit[][];
        static int n, s;
        static int graph[][];
        static int age = 2;
        static int count = 0;
        static int ans = 0;
        static int sX, sY;
        static int minX;
        static int minY;
        static int minDist;
        static int iii = 0;
    
        public static void main(String[] args) throws IOException {
            // write your code here
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            String num = br.readLine();
            n = Integer.parseInt(num);
            graph = new int[n][n];
    
            for (int i = 0; i < n; i++) {
                String[] tmp = br.readLine().split(" ");
                for (int j = 0; j < n; j++) {
                    graph[i][j] = Integer.parseInt(tmp[j]);
                    if (graph[i][j] == 9) {
                        sX = i;
                        sY = j;
                        graph[sX][sY] = 0;
                    }
                }
            }
    
            while (true) {
                //초기화 하는 이유는 상어가 이동한 위치에서부터 dist를 계산해야 하기때문
                visit = new int[n][n];
                minX = Integer.MAX_VALUE;
                minY = Integer.MAX_VALUE;
                minDist = Integer.MAX_VALUE;
    
                bfs(sX, sY);
    
                if(minX != Integer.MAX_VALUE && minY != Integer.MAX_VALUE){
                    count++;
                    ans = ans + visit[minX][minY];
                    if(count == age){
                        age++;
                        count = 0;
                    }
                    graph[minX][minY] = 0;
                    sX = minX;
                    sY = minY;
                }
                else
                    break;
                System.out.println("end");
            }
            System.out.println();
            bw.write(ans + "\n");
            br.close();
            bw.close();
        }
    
        private static void bfs(int x, int y) {
            Queue<Pair> queue = new LinkedList<>();
            queue.add(new Pair(x, y));
    
            while (!queue.isEmpty()) {
                Pair p = queue.poll();
                for (int i = 0; i < 4; i++) {
                    int newX = p.x + dx[i];
                    int newY = p.y + dy[i];
                    //이동 가능한지 검사
                    if ((newX >= 0 && newX <= n - 1) && (newY >= 0 && newY <= n - 1)) {
                        if (graph[newX][newY] <= age && visit[newX][newY] == 0) {
                            visit[newX][newY] = visit[p.x][p.y] + 1;
                            // 해당 위치 물고기 먹을 수 있는지 검사
                            if (graph[newX][newY] < age && graph[newX][newY] != 0) {
                                if (minDist > visit[newX][newY]) {
                                    minDist = visit[newX][newY];
                                    minX = newX;
                                    minY = newY;
                                } else if (minDist == visit[newX][newY]) {
                                    if (minX == newX) {
                                        if (minY > newY) {
                                            minX = newX;
                                            minY = newY;
                                        }
                                    } else {
                                        if (minX > newX) {
                                            minX = newX;
                                            minY = newY;
                                        }
                                    }
                                }
    
                            }
                            System.out.println(newX+" "+ newY+" ");
                            queue.add(new Pair(newX, newY));
                        }
                    }
                }
            }
        }
    }
    
    class Pair {
        public int x;
        public int y;
    
        public Pair(int x, int y) {
            this.x = x;
            this.y = y;
        }
    }