GCJ2010 Round1A A "Rotate"

問題:http://code.google.com/codejam/contest/dashboard?c=544101#s=p0

  • 時計回りに回転(一行読み込みながらRとBを右詰め)
  • RかBがK個あるかを判定(i行j列目から右,右下,下,左下方向で個数を数える)
import java.io.File;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Rotate {
	public static void main(String[] args) throws Exception {
		String filename = "A-large";
		Scanner scan = new Scanner(new File(filename + ".in"));
		PrintWriter out = new PrintWriter(new File(filename + ".out"));
		int T = scan.nextInt();
		scan.nextLine();
		for (int t = 0; t++ < T;) {
			int N = scan.nextInt();
			int K = scan.nextInt();
			char[][] cs = new char[N][];
			for (int i = 0; i < N; i++) {
				cs[i] = scan.next().toCharArray();
				// 右詰め
				for (int j = N - 1; j > 0; j--) {
					if (cs[i][j] == '.') {
						for (int k = j - 1; k >= 0; k--) {
							if (cs[i][k] != '.') {
								char tmp = cs[i][j];
								cs[i][j] = cs[i][k];
								cs[i][k] = tmp;
								break;
							}
						}
					}
				}
				// 右詰め終わり
				System.out.println(Arrays.toString(cs[i]));
			}
			Set<Character> win = new HashSet<Character>();
			l:for (int i = 0; i < N; i++) {
				for (int j = 0; j < N; j++) {
					// RかBが
					if (cs[i][j] != '.') {
						char p = cs[i][j];
						int[] counts = new int[4];
						// i行j列目からK個あるか判定
						for (int k = 0; k < K; k++) {
							// 下
							if (i+k < N && p == cs[i + k][j]) {
								counts[0]++;
							}
							// 右
							if (j+k < N&&p == cs[i][j + k]) {
								counts[1]++;
							}
							// 右下
							if (i+k<N&&j+k<N&&p == cs[i + k][j + k]) {
								counts[2]++;
							}
							// 左下
							if (i+k<N&&j-k>=0&&p == cs[i + k][j - k]) {
								counts[3]++;
							}
						}
						for (int count : counts) {
							if (count == K) {
								win.add(p);
								if (win.size() == 2) {
									break l;
								}
							}
						}
					}
				}
			}

			String result = win.size()==0 ? "Neither" : win.size() == 2?"Both":win.contains('R')?"Red":"Blue";
			
			out.printf("Case #%d: %s\n", t, result);
		}
		out.flush();
	}
}