【paiza 演習問題】島探し (paizaランク S )(タイムアウト)


対象

これは paizaランク S 相当の練習問題としてここにあった問題の解答を記録するものであり、初心者向けです。
(上級者の方のアドバイスは頂きたいです……)

概要

入力値ケース9にてタイムアウトを吐かれたのでリファクタリングを行いたい。(未考察、後日追記します)

コード

def out_of_area_check(width, height, x, y):
    x_in_area = 0 <= x < width
    y_in_area = 0 <= y < height
    #print(width, height, x, y)
    #print(x_in_area, y_in_area)
    return x_in_area and y_in_area


def island_seek(frontline_x, frontline_y, value_map, index, width, height):
    while len(frontline_x) > 0:
        #print('check')
        for _i, _j in zip([+1, -1, 0, 0],[0, 0, +1, -1]):
            x = frontline_x[0] + _i
            y = frontline_y[0] + _j
            if out_of_area_check(width, height, x, y):
                #print(x, y)
                if value_map[y][x] == -1:
                    value_map[y][x] = index
                    frontline_y.append(y)
                    frontline_x.append(x)

        del frontline_x[0]
        del frontline_y[0]
    else:
        return


def peninsula_seek(frontline_x, frontline_y, value_map, index, width, height):
    for _x in range(width):
        for _y in range(height):
            if value_map[_y][_x] == -1:
                value_map[_y][_x] = index
                frontline_y.append(_y)
                frontline_x.append(_x)
                return True
    else:
        return False


def solve():
    width, height = map(int, input().split())
    value_map = [list(map(int, input().split())) for _ in range(height)]
    frontline_x = []
    frontline_y = []
    index = 0
    for j in range(width):
        for i in range(height):
            if value_map[i][j] == 1:
                value_map[i][j] = -1

    peninsula = True
    while peninsula:
        index += 1
        #print('index+1')
        peninsula = peninsula_seek(frontline_x, frontline_y, value_map, index, width, height)

        #print(value_map)
        if peninsula:
            island_seek(frontline_x, frontline_y, value_map, index, width, height)
            #print(value_map)
        else:
            print(index-1)
            return


if __name__ == "__main__":
    solve()