LoginSignup
0
0

More than 3 years have passed since last update.

AtCoder Beginner Contest 129 D lamp

Last updated at Posted at 2019-06-23

AtCoder Beginner Contest 129 lamp

D問題のlampを解いてみた。

  • 上下左右でそれぞれの地点から障害物もしくは端にぶつかるまでの距離を算出し、行列化する。
  • 距離の計算は、行または列の番号を+1するとともに距離の数値を+1、障害物にぶつかった場合値を-1にする処理で求まる。障害物があるグリッドの値を便宜的に-1にしておくと、その次のインクリメントで隣のグリッドの距離の値が0になり、いい感じに。
  • 上下左右に1列最初に追加しておき、追加した分のグリッドを-1としておく。
  • 二次元配列ははnumpyでやった方がやりやすい。行列どうしを足したり引いたりもnumpyなら簡単。
  • 最後に光源を置いているグリッドの分+1する。

# 上下左右の壁までの距離の行列


def max_grid_num():
    raw_input = input().split()
    H = int(raw_input[0])
    W = int(raw_input[1])
    grid_matrix = raw_input[2:]
    from_up_range = (range(1, H+1), range(1, W+1))
    from_low_range = (range(H, 0, -1), range(1, W+1))
    from_left_range = (range(1, H+1), range(1, W+1))
    from_right_range = (range(1, H+1), range(W, 0, -1))
    cumsum_matrix = np.zeros((H+2, W+2))
    for (y_range, x_range), (before_y, before_x) in ((from_up_range, (-1, 0)), (from_low_range, (1, 0)),
            ((from_left_range), (0, -1)), (from_right_range, (0, 1))):
        each_num_matrix = np.full((H+2, W+2), -1)
        for y in y_range:
            for x in x_range:
                if grid_matrix[y-1][x-1] == '#':
                    each_num_matrix[y][x] = -1
                else:
                    each_num_matrix[y][x] = each_num_matrix[y+before_y][x+before_x] +1
        cumsum_matrix += each_num_matrix
    return int(cumsum_matrix.max()+1)

こうした方がいい、というのあったらアドバイスお願いします!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0