満を持してのボス戦。
最初はキューを二本化するプランを考えてみたが、一本のキューで交互に入れる方針に変換。
クラス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;
}
}
こうやって記録して発表することで記憶が定着するのだなあ……。
今後も書き留めていきます。