[白俊]#2931ガス配管



質問する


ロシアの天然ガスをクロアチアに運ぶために、ザグレブとモスクワのバスがパイプラインを設計している.2人は実際の設計を行う前に、パイプマニアゲームを利用して設計しようとした.
このゲームでは、ヨーロッパはR行C列に分かれています.各セルは、空白または下図に示す7つの基本ブロックで構成されます.

ガスはモスクワからザグレブに流れた.ガスはブロックを通って双方向に流れることができます."+"次の例のように2つの方向(垂直、水平)に流れる特殊なブロックです.

パイプラインの設計が終わった後、二人で少し夕食を食べに行きました.その間、ハッカーが侵入してブロックをクリアしました.クリアされたブロックは空です.
ハッカーが削除したセルと、元のブロックを特定するプログラムを作成してください.

入力


最初の行はヨーロッパのサイズRとCを与えます.(1 ≤ R, C ≤ 25)
次のR行には、次の文字からなるC文字があります.
  • のスペースを表す「.」
  • ブロックを表す「|」(Aski 124)、「-」、「+」、「1」,「2」,「3」,「4」
  • モスクワの位置にある「M」と「Z」.2つの字は1回しか与えられない.
  • 答えが常に存在し、ガスの流れが唯一の場合にのみ入力され、またモスクワとザグラーブの隣接するブロックにのみ入力されます.また、不要なブロックは存在しない.つまり、消えたブロックを追加すると、すべてのブロックにガスが流れます.

    しゅつりょく


    消去されたブロックの行と列の位置を出力し、どのブロックであるかを出力します.

    入力例1

    3 7
    .......
    .M-.-Z.
    .......

    サンプル出力1

    2 4 -

    入力例2

    3 5
    ..1-M
    1-+..
    Z.23.

    サンプル出力2

    2 4 4

    入力例3

    6 10
    Z.1----4..
    |.|....|..
    |..14..M..
    2-+++4....
    ..2323....
    ..........

    サンプル出力3

    3 3 |

    に答える


    これは,コードが長いが,非常に困難ではない多くの条件を考慮する必要がある簡単な実装問題である.
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.LinkedList;
    import java.util.Queue;
    
    public class Main {
        static int N;
        static int M;
        static char[][] map;
        static int[] dx = {-1, 1, 0, 0};
        static int[] dy = {0, 0, -1, 1};
    
        public static void main(String[] args) throws Exception{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String[] input = br.readLine().split(" ");
            N = Integer.parseInt(input[0]);
            M = Integer.parseInt(input[1]);
            map = new char[N][M];
            Pair start = null;
    
            for(int i=0; i<N; i++) {
                String str = br.readLine();
                for(int j=0; j<M; j++) {
                    map[i][j] = str.charAt(j);
    
                    if(map[i][j]=='M') {
                        start = new Pair(i, j, -1);
                        map[i][j]='.';
                    }
    
                    if(map[i][j]=='Z')
                        map[i][j]='.';
                }
            }
    
            for(int i=0; i<4; i++) {
                int nx = start.x+dx[i];
                int ny = start.y+dy[i];
    
                if(nx<0 || nx>=N || ny<0 || ny>=M) continue;
    
                if(map[nx][ny]!='.') {
                    bfs(start.x, start.y, i);
                    break;
                }
            }
        }
    
        public static void bfs(int x, int y, int idx) {
            Queue<Pair> queue = new LinkedList<>();
            queue.add(new Pair(x, y, idx));
    
            loop:while(!queue.isEmpty()) {
                Pair temp = queue.poll();
                int nx = temp.x+dx[temp.idx];
                int ny = temp.y+dy[temp.idx];
    
                switch(map[nx][ny]) {
                    case '|':
                        queue.add(new Pair(nx, ny, temp.idx));
    
                    break;
    
                    case '-':
                        queue.add(new Pair(nx, ny, temp.idx));
    
                    break;
    
                    case '+':
                        queue.add(new Pair(nx, ny, temp.idx));
    
                    break;
    
                    case '1': {
                        if(temp.idx==2) {
                            queue.add(new Pair(nx, ny, 1));
                        }
    
                        else {
                            queue.add(new Pair(nx, ny, 3));
                        }
                    }
                    break;
    
                    case '2': {
                        if(temp.idx==1) {
                            queue.add(new Pair(nx, ny, 3));
                        }
    
                        else {
                            queue.add(new Pair(nx, ny, 0));
                        }
                    }
                    break;
    
                    case '3': {
                        if(temp.idx==1) {
                            queue.add(new Pair(nx, ny, 2));
                        }
    
                        else {
                            queue.add(new Pair(nx, ny, 0));
                        }
                    }
                    break;
    
                    case '4': {
                        if(temp.idx==3) {
                            queue.add(new Pair(nx, ny, 1));
                        }
    
                        else {
                            queue.add(new Pair(nx, ny, 2));
                        }
                    }
                    break;
    
                    case '.': {
                        if(temp.idx==0) {
                            char ans = ' ';
                            int cnt = 0;
    
                            if(nx>=1 && map[nx-1][ny]!='.' && map[nx-1][ny]!='-' && map[nx-1][ny]!='2' && map[nx-1][ny]!='3') {
                                ans = '|';
                                cnt++;
                            }
    
                            if(ny>=1 && map[nx][ny-1]!='.' && map[nx][ny-1]!='|' && map[nx][ny-1]!='3' && map[nx][ny-1]!='4') {
                                ans = '4';
                                cnt++;
                            }
    
                            if(ny<M-1 && map[nx][ny+1]!='.' && map[nx][ny+1]!='|' && map[nx][ny+1]!='1' && map[nx][ny+1]!='2') {
                                ans = '1';
                                cnt++;
                            }
    
                            if(cnt==3)
                                System.out.println((nx+1)+" "+(ny+1)+" +");
                            else
                                System.out.println((nx+1)+" "+(ny+1)+" "+ans);
    
                            break loop;
                        }
    
                        else if(temp.idx==1) {
                            char ans = ' ';
                            int cnt = 0;
    
                            if(nx<N-1 && map[nx+1][ny]!='.' && map[nx+1][ny]!='-' && map[nx+1][ny]!='1' && map[nx+1][ny]!='4') {
                                ans = '|';
                                cnt++;
                            }
    
                            if(ny>=1 && map[nx][ny-1]!='.' && map[nx][ny-1]!='|' && map[nx][ny-1]!='3' && map[nx][ny-1]!='4') {
                                ans = '3';
                                cnt++;
                            }
    
                            if(ny<M-1 && map[nx][ny+1]!='.' && map[nx][ny+1]!='|' && map[nx][ny+1]!='1' && map[nx][ny+1]!='2') {
                                ans = '2';
                                cnt++;
                            }
    
                            if(cnt==3)
                                System.out.println((nx+1)+" "+(ny+1)+" +");
                            else
                                System.out.println((nx+1)+" "+(ny+1)+" "+ans);
    
                            break loop;
                        }
    
                        else if(temp.idx==2) {
                            char ans = ' ';
                            int cnt = 0;
    
                            if(ny>=1 && map[nx][ny-1]!='.' && map[nx][ny-1]!='|' && map[nx][ny-1]!='3' && map[nx][ny-1]!='4') {
                                ans = '-';
                                cnt++;
                            }
    
                            if(nx>=1 && map[nx-1][ny]!='.' && map[nx-1][ny]!='-' && map[nx-1][ny]!='2' && map[nx-1][ny]!='3') {
                                ans = '2';
                                cnt++;
                            }
    
                            if(nx<N-1 && map[nx+1][ny]!='.' && map[nx+1][ny]!='-' && map[nx+1][ny]!='1' && map[nx+1][ny]!='4') {
                                ans = '1';
                                cnt++;
                            }
    
                            if(cnt==3)
                                System.out.println((nx+1)+" "+(ny+1)+" +");
                            else
                                System.out.println((nx+1)+" "+(ny+1)+" "+ans);
    
                            break loop;
                        }
    
                        else {
                            char ans = ' ';
                            int cnt = 0;
    
                            if(ny<M-1 && map[nx][ny+1]!='.' && map[nx][ny+1]!='|' && map[nx][ny+1]!='1' && map[nx][ny+1]!='2') {
                                ans = '-';
                                cnt++;
                            }
    
                            if(nx>=1 && map[nx-1][ny]!='.' && map[nx-1][ny]!='-' && map[nx-1][ny]!='2' && map[nx-1][ny]!='3') {
                                ans = '3';
                                cnt++;
                            }
    
                            if(nx<N-1 && map[nx+1][ny]!='.' && map[nx+1][ny]!='-' && map[nx+1][ny]!='1' && map[nx+1][ny]!='4') {
                                ans = '4';
                                cnt++;
                            }
    
                            if(cnt==3)
                                System.out.println((nx+1)+" "+(ny+1)+" +");
                            else
                                System.out.println((nx+1)+" "+(ny+1)+" "+ans);
    
                            break loop;
                        }
                    }
                }
            }
        }
    
        public static class Pair {
            int x;
            int y;
            int idx;
    
            public Pair(int x, int y, int idx) {
                this.x = x;
                this.y = y;
                this.idx = idx;
            }
        }
    }