Topcoder Member SRM 494 div2 medium "Painting"

問題:http://www.topcoder.com/stat?c=problem_statement&pm=11310

ラクティス.

ある大きさのキャンバスに描くべき絵を描くことができる正方形の筆の最大の大きさを求める.

試し塗りをしてゆけばいいらしい.

コード

public class Painting {

	public int largestBrush(String[] picture) {
		int n = picture.length, m = picture[0].length();
		char[][] cs = new char[n][];
		for (int i = 0; i < n; ++i) {
			cs[i] = picture[i].toCharArray();
		}
		int size = Math.min(n, m);
		l1: for (; size > 0; --size) {
			boolean[][] painted = new boolean[n][m];
			for (int i = 0; i < n; ++i) {
				for (int j = 0; j < m; ++j) {
					boolean isPaintable = i + size <= n && j + size <= m;
					if (isPaintable)
						l2: for (int x = i; x < i + size; ++x) {
							for (int y = j; y < j + size; ++y) {
								if (cs[x][y] == 'W') {
									isPaintable = false;
									break l2;
								}
							}
						}
					if (isPaintable) {
						for (int x = i; x < n && x < i + size; ++x) {
							for (int y = j; y < m && y < j + size; ++y) {
								painted[x][y] = true;
							}
						}
					}
				}
			}
			for (int i = 0; i < n; ++i) {
				for (int j = 0; j < m; ++j) {
					if (!painted[i][j] && cs[i][j] == 'B') {
						continue l1;
					}
				}
			}
			break;
		}
		return size;
	}

}