今日はGoogle CodejamのQualificationラウンドでしたね。
張り切って参加したもののMinesweeper Masterが、解けそうで解けなかったので書いときます。マインスイーパが1クリックで解ける条件として、空のセルは1つの領域に固まってる必要があって、それをボードのサイズで細かく場合分けして行く感じでした。
僕は「ボードの小さい方の辺が2以上の場合に、空のセルが5もしくは7の時は解けない」という条件が思いつけず、あえなく時間切れになってしまいました。サンプルを処理するまでは、結構簡単に出来たのですけど、
そのダラダラデバッグしてたら解ききれなくて悲しいです。タイムアップ後少し修正したコードを貼っておきます。
# -*- coding: utf-8 -*- import sys def judge(R, C, M): E = R * C - M # empty W, last_row, need_adjust = (0, 0, False) if E == 0: pass elif E == 1 or M == 0: W = C elif C == 1: if E > 0: W = 1 elif C == 2: last_row = int(E / 2) + 1 # 1 base if E % 2 == 0 and E >= 4: W = 2 elif E == 5 or E == 7: pass elif C >= 3: for w in range(2, C+1): last_row = int(E / w) + 1 # 1 base last_row_num = E % w if E < = w: continue if last_row > R: continue if last_row == 2: if last_row_num == 0: W = w break elif last_row >= 3: if last_row_num >= 2 or last_row_num == 0: W = w break elif w >= 3 and last_row_num == 1 and R >= 3: W = w need_adjust = True break return W, last_row, need_adjust for T in range(1, int(sys.stdin.readline())+1): (R, C, M) = map(int, sys.stdin.readline().split(' ')) transpose = False if C > R: (R, C) = (C, R) transpose = True E = R * C - M # empty W, last_row, need_adjust = judge(R, C, M) if W == 0: ans = 'Impossible' print 'Case #%(T)s:\n%(ans)s' % locals() continue # make board board = [['*'] * C for i in range(R)] for i in range(E): c = i % W r = i / W board[r][c] = '.' if need_adjust: board[last_row-1][1], board[last_row-2][W-1] = board[last_row-2][W-1], board[last_row-1][1] if transpose: board = map(list, zip(*board)) R, C = (C, R) board[0][0] = 'c' # show answer print 'Case #%(T)s:' % locals() def show_board(board): for row in board: print ''.join(row) show_board(board)
今年はTシャツ欲しいです。