いびつなリバーシ対戦 Javaで

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_pincerattack_boss

ぬるりと解けてしまった。
斜めでドはまりしたが、一度お手本を理解してしまえば、新しく要求される機能を実装していくだけで特に苦労なし。
メソッドを分けると「あ、なんかそれっぽいことやってる」気分になる……かもしれない。

```java
import java.util.Scanner;


public class Main {
    static int h, w, n, t;
    static String[][] map;

    public static void cul(int y, int x, String AB){
        //_____縦_____
        for(int i=-1; i<=1; i+=2){
            for(int j=1; ; j++){

                if(y+(i*j) == -1 || y+(i*j) == h || map[y+(i*j)][x].equals("#")){
                    break;
                }

                if(map[y+(i*j)][x].equals(AB)){
                    for(int k = Math.min(y+(i*j), y); k <= Math.max(y+(i*j), y); k++){
                        map[k][x] = AB;
                    }
                    break;
                }
            }
        }

        //_____横_____
        for(int i=-1; i <= 1; i+=2){
            for(int j=1; ; j++){

                if(x+(i*j) == -1 || x+(i*j) == w || map[y][x+i*j].equals("#")){
                    break;
                }

                if(map[y][x+(i*j)].equals(AB)){
                    for(int k = Math.min(x+(i*j), x); k <= Math.max(x+(i*j), x); k++){
                        map[y][k] = AB;
                    }
                    break;
                }
            }
        }

        //_____斜め_____
        for(int i=-1; i <= 1; i+=2){
            for(int j=1; ; j++){

                if(x+(i*j) == -1 || x+(i*j) == w || y+(i*j) == -1 || y+(i*j) == h || map[y+(i*j)][x+(i*j)].equals("#")){
                    break;
                }

                if(map[y+(i*j)][x+(i*j)].equals(AB)){
                    for(int k = Math.min(y+(i*j), y); k <= Math.max(y+(i*j), y); k++){
                        map[k][k-y+x] = AB;
                    }
                    break;
                }
            }
        }

        for(int i=-1; i <= 1; i+=2){
            for(int j=1; ; j++){

                if(x+(i*j) == -1 || x+(i*j) == w || y-(i*j) == -1 || y-(i*j) == h || map[y-(i*j)][x+(i*j)].equals("#")){
                    break;
                }

                if(map[y-(i*j)][x+(i*j)].equals(AB)){
                    for(int k = Math.min(x+(i*j), x); k <= Math.max(x+(i*j), x); k++){
                        map[y+x-k][k] = AB;
                    }
                    break;
                }
            }
        }
        map[y][x] = AB;
    }


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        h = sc.nextInt();
        w = sc.nextInt();
        n = sc.nextInt();   //人数
        t = sc.nextInt();   //合計ターン数

        map = new String[h][w];

        for(int i=0; i<h; i++){
            String temp = sc.next();
            for(int j=0; j<w; j++){
                map[i][j] = String.valueOf(temp.charAt(j));
            }
        }
        //_____ここまで初期化______

        for(int i=0; i<t; i++){
            String p = sc.next();
            int b = sc.nextInt();
            int a = sc.nextInt();

            cul(b, a, p);
        }

        // _____ここから表示_______
        for(int i=0; i<h; i++){
            for(int j=0; j<w; j++){
                System.out.print(map[i][j]);
            }
            System.out.println("");
        }
    }
}
```