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