0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

 満を持してのボス戦。

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

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

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;
    }
}

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?