AOJ2014 Surrounding Area

問題リンク Surrounding Area

  • 解法

杭の打たれていないマス(i, j)について、そのマスからWに辿りつけるか、Bに辿りつけるかを調べます。Wに辿りつけるが、Bには辿りつけない場合、そのマスは白の領域です。黒についても同様です。これを全ての空きマスに対して行います。

  • ソース
import java.util.Scanner;

//Surrounding Area
public class AOJ2014 {

	int w, h;
	char[][] m;
	int[][] move = {{-1,0}, {0,1}, {1,0}, {0,-1}};
	boolean[][] white, black;

	void fw(int i, int j){
		if(white[i][j]||m[i][j]!='.')return;
		white[i][j] = true;
		for(int k=0;k<4;k++){
			int ni = i+move[k][0], nj = j+move[k][1];
			if(0<=ni&&ni<h&&0<=nj&&nj<w)fw(ni, nj);
		}
	}
	void fb(int i, int j){
		if(black[i][j]||m[i][j]!='.')return;
		black[i][j] = true;
		for(int k=0;k<4;k++){
			int ni = i+move[k][0], nj = j+move[k][1];
			if(0<=ni&&ni<h&&0<=nj&&nj<w)fb(ni, nj);
		}
	}

	void run(){
		Scanner sc = new Scanner(System.in);
		for(;;){
			w = sc.nextInt(); h = sc.nextInt();
			if((w|h)==0)break;
			m = new char[h][];
			for(int i=0;i<h;i++)m[i]=sc.next().toCharArray();
			white = new boolean[h][w]; black = new boolean[h][w];
			for(int i=0;i<h;i++)for(int j=0;j<w;j++){
				if(m[i][j]=='W'){
					for(int k=0;k<4;k++){
						int ni = i+move[k][0], nj = j+move[k][1];
						if(0<=ni&&ni<h&&0<=nj&&nj<w)fw(ni, nj);
					}
				}
				if(m[i][j]=='B'){
					for(int k=0;k<4;k++){
						int ni = i+move[k][0], nj = j+move[k][1];
						if(0<=ni&&ni<h&&0<=nj&&nj<w)fb(ni, nj);
					}
				}
			}
			int cw = 0, cb = 0;
			for(int i=0;i<h;i++)for(int j=0;j<w;j++){
				if(m[i][j]!='.'||white[i][j]&&black[i][j]||!white[i][j]&&!black[i][j])continue;
				if(white[i][j])cw++;
				else cb++;
			}
			System.out.println(cb+" "+cw);
		}
	}

	public static void main(String[] args) {
		new AOJ2014().run();
	}
}