GoogleCodeJam2009 Qualification Round

Tags:
  2009/09/05 23:20

予選。
夜中しか無理だったので、睡魔との戦い。

A. Alien Language

考えようではただの正規表現。
(Hashでいけるかと組んでみたけど、smallすら無理だった)

	public AlienLanguage() throws FileNotFoundException{
		FileInputStream fis = new FileInputStream("src/qualification_round/A-large.in");
		Scanner sc = new Scanner(fis);

		int L = sc.nextInt();
		int D = sc.nextInt();
		int N = sc.nextInt();

		char[][] d = new char[D][L];

		// dic
		for (int i = 0; i < D; i++) {
			d[i] = sc.next().toCharArray();
		}

		char[][] t = new char[L][];

		// test case
		for (int i = 0; i < N; i++) {
			String s = sc.next();

			int p = 0;
			for (int j = 0; j < s.length(); j++, p++) {
				char c = s.charAt(j);

				if (c == '(') {
					int b = j;
					while (c != ')') {
						c = s.charAt(++j);
					}
					t[p] = s.substring(b + 1, j).toCharArray();
					Arrays.sort(t[p]);
				} else {
					t[p] = new char[]{c};
				}
			}

			int count = 0;
			for (int j = 0; j < D; j++) {
				for (int k = 0; k < L; k++) {
					if (Arrays.binarySearch(t[k], d[j][k]) < 0) {
						break;
					}
					if (k == L - 1) {
						count++;
					}
				}
			}
			System.out.println("Case #" + (i + 1) + ": " + count);
		}
	}

B. Watersheds

問題文の翻訳に苦戦。名詞よくわかんない。
コード自体は素直に左上から順に流していく感じ。

	Point[] p = new Point[]{new Point(-1, 0), new Point(0, -1), new Point(0, 1), new Point(1, 0)};
	int[][] map;
	char[][] result;
	char label;

	public Watersheds() throws FileNotFoundException {
		FileInputStream fis = new FileInputStream("src/qualification_round/B-large.in");
		Scanner sc = new Scanner(fis);

		int M = sc.nextInt();

		for (int i = 0; i < M; i++) {
			int H = sc.nextInt();
			int W = sc.nextInt();

			// init
			map = new int[H + 2][W + 2];
			Arrays.fill(map[0], 10000);
			Arrays.fill(map[H + 1], 10000);
			for (int j = 0; j < H + 2; j++) {
				map[j][0] = 10000;
				map[j][W + 1] = 10000;
			}

			// build map
			for (int j = 1; j < H + 1; j++) {
				for (int k = 1; k < W + 1; k++) {
					map[j][k] = sc.nextInt();
				}
			}

			// flow
			result = new char[H + 2][W + 2];
			result[1][1] = label = 'a';

			flow(1, 1, (char)0, new LinkedList<Point>());
			for (int j = 1; j < H + 1; j++) {
				for (int k = 1; k < W + 1; k++) {
					if (result[j][k] < 'a') flow(j, k, (char)0, new LinkedList<Point>());
				}
			}

			// output
			System.out.println("Case #" + (i + 1) + ":");
			for (int j = 1; j < H + 1; j++) {
				for (int k = 1; k < W + 1; k++) {
					if (k != 1) System.out.print(" ");
					System.out.print(result[j][k]);
				}
				System.out.println();
			}
		}
	}

	public void flow(int h, int w, char l, LinkedList<Point> list){
		list.add(new Point(h, w));
		// has label?
		if (result[h][w] >= 'a') {
			l = result[h][w];
		}

		// has next?
		int min = map[h][w];
		int d = -1;
		for (int i = 0; i < 4; i++) {
			if (min > map[h + p[i].x][w + p[i].y]) {
				min = map[h + p[i].x][w + p[i].y];
				d = i;
			}
		}

		if (d >= 0) {
			// flow
			flow(h + p[d].x, w + p[d].y, l, list);
		} else {
			// bain
			if (l < 'a') l = ++label;
			for (Iterator<Point> iterator = list.iterator(); iterator.hasNext();) {
				Point point = iterator.next();
				result[point.x][point.y] = l;
			}
		}
	}

C. Welcome to Code Jam

意味はわかりやすかったけど、眠気に負けて寝落ち。
DP嫌いだったという理由もあったとかなかったとか(笑

起きてスコアみてみたら、全然苦労した記憶ないのに、B解くのに2時間くらいかかってた。
次は時間制限あるし、いい時間にやれるといいなあ。

とりあえず66pで次にはあがれそうなので、Tシャツ目指して頑張ります。