陣取りゲーム 【paiza Aランクレベルアップメニュー】

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

　満を持してのボス戦。

　最初はキューを二本化するプランを考えてみたが、一本のキューで交互に入れる方針に変換。
　クラスXYにAかBかを持たせて、「値が変わったら手番終了と判断して引数を１増やす」。

「どっちのターンかを配列で持っておいて、引数のカウンターは増やし続け、余りで判定する」という発想は前のランクから。
　みんなうまいこと考えるもんだなあ。

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

```java:Main.java
import java.util.Scanner;
import java.util.Queue;
import java.util.ArrayDeque;


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

        int h = sc.nextInt();
        int w = sc.nextInt();
        String n = sc.next();   //先行
        String[][] map = new String[h][w];  //陣

        Queue<XY> q = new ArrayDeque<>();   //キュー。一本化する

        int ay=0, ax=0, by=0, bx=0; //初期位置のy,x座標
        
        String[] ab = new String[2];        //AかB。先行を先に入れる（先行の引数が偶数）
        if(n.equals("A")){
            ab[0] = "A";
            ab[1] = "B";
        } else if (n.equals("B")){
            ab[0] = "B";
            ab[1] = "A";
        }
        
        int abc = 0;    //abのcounterなのでabc

        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));
                if(map[i][j].equals("A")){  //Aのスタート
                    ay = i;
                    ax = j;
                }
                if(map[i][j].equals("B")){  //Bのスタート
                    by = i;
                    bx = j;
                }
            }
        }
        
        //初期化。先行から。
        if(n.equals("A")){
            q.add(new XY(ay, ax, ab[abc%2]));
            abc++;
            q.add(new XY(by, bx, ab[abc%2]));
            abc++;
        } else if(n.equals("B")){
            q.add(new XY(by, bx, ab[abc%2]));
            abc++;
            q.add(new XY(ay, ax, ab[abc%2]));
            abc++;
        }
        
        //ここからメイン処理
        while(q.size() > 0){
            XY xy = q.poll();

            int y = xy.y;
            int x = xy.x;
            String turn = xy.AB;
            
            //ここで引っ張ってきたABが違うなら手番終了と見なす。カウンターに+1
            if(!turn.equals(ab[abc%2])){
                abc++;
            }
            
            if(y > 0 && map[y-1][x].equals(".")){   //上
                map[y-1][x] = turn;   //陣地に塗り替える
                q.add(new XY(y-1, x, ab[abc%2]));  //次の手番を入れておく
            }
            if(y < h-1 && map[y+1][x].equals(".")){   //下
                map[y+1][x] = turn;
                q.add(new XY(y+1, x, ab[abc%2]));
            }
            if(x < w-1 && map[y][x+1].equals(".")){   //右
                map[y][x+1] = turn;
                q.add(new XY(y, x+1, ab[abc%2]));
            }
            if(x > 0 && map[y][x-1].equals(".")){   //左
                map[y][x-1] = turn;
                q.add(new XY(y, x-1, ab[abc%2]));
            }
        }
        
        //出力処理
        int asc=0, bsc=0;
        
        for(int i=0; i<h; i++){
            for(int j=0; j<w; j++){
                if(map[i][j].equals("A")){
                    asc++;
                } else if(map[i][j].equals("B")){
                    bsc++;
                }
            }
        }
        
        if(asc > bsc){
            System.out.println(asc + " " + bsc + "\nA");
        } else {
            System.out.println(asc + " " + bsc + "\nB");
        }
    }
}

class XY{
    int y;
    int x;
    String AB;

    XY(int y, int x, String ab){
        this.y = y;
        this.x = x;
        AB = ab;
    }
}
```

　こうやって記録して発表することで記憶が定着するのだなあ……。
　今後も書き留めていきます。