Problem:
A さんの家に親戚の B 君がやってきました。彼は 3 歳でブロックが大好きです。彼が持っているブロックは図 1 のような形をしています。    図1  B 君はボードの上にブロックを敷き詰めています。彼に「何を作っているの?」と聞くと、彼は「迷路!!」と元気よく答えました。彼の言う迷路とは、スタートからゴールまで側面が接している、同じ色のブロックだけでたどることができるブロックの配置のことだそうです。図 2 は黄色のブロックにより、左上(スタート)から右下(ゴール)へ迷路ができていることを表しています。    図2  無邪気に遊んでいる B 君を横目に、プログラマーであるあなたは、ブロックの並びが迷路となっているかを確かめてみることにしました。  ブロックの情報とスタート、ゴールの座標を入力とし、ブロックが迷路となっていれば OK 、なっていなければ NG を出力するプログラムを作成してください。 ボードは横方向に w 、縦方向に h の大きさをもち、 左上の座標は(1 , 1)、右下の座標は(w, h)とします。ブロックは 2 × 4 の長方形ですべて同じ大きさです。ブロックの色 c は 1 (白)、2 (黄)、3 (緑)、4 (青)、5 (赤) のいずれかです。ブロックのボード上での向き d は 横方向に長い場合 0 、 縦方向に長い場合 1 とします。 ブロックの位置はブロックの左上の座標 (x, y) によって表されます。なお、ブロックの位置は他のブロックと重なることは無く、ボードからはみ出すこともありません。

Incorrect submission (verdict: Wrong Answer):
from sys import stdin
readline = stdin.readline


from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
Block = namedtuple('Block', ['color', 'direction', 'x', 'y'])


def occupation_point(block):
    x, y = block.x, block.y
    d = [(0, 0), (1, 0), (0, 1), (1, 1)]
    for dx, dy in d:
        yield x + dx, y + dy
    if block.direction:
        y += 2
    else:
        x += 2
    for dx, dy in d:
        yield x + dx, y + dy

def paintout(board, start, value):
    color = board[start.y][start.x]
    if color == 0:
        return
    que =[(start.x, start.y)]
    print('cv',color, value)
    while que:
        x,y = que.pop()
        if board[y][x] == color:
            board[y][x] = value
            que.extend([(x + dx, y + dy) for dx, dy in [(-1, 0), (0, -1), (1, 0), (0, 1)]])


def is_reachable(size, start, goal, blocks):
    board = [[0] * (size.x + 2) for _ in range(size.y + 2)]
    for bi in blocks:
        for x, y in occupation_point(bi):
            board[y][x] = bi.color
    paintout(board, start, -1)
    for bi in board:
        print(bi)
    return board[goal.y][goal.x] == -1


while True:
    size = Point(*map(int, readline().split()))
    if size.x == 0:
        break
    start = Point(*map(int, readline().split()))
    goal = Point(*map(int, readline().split()))
    blocks = []
    for _ in range(int(readline())):
        blocks.append(Block(*map(int, readline().split())))
    print('OK' if is_reachable(size, start, goal, blocks) else 'NG')

Fixed, accepted submission:
from sys import stdin
readline = stdin.readline


from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
Block = namedtuple('Block', ['color', 'direction', 'x', 'y'])


def occupation_point(block):
    x, y = block.x, block.y
    d = [(0, 0), (1, 0), (0, 1), (1, 1)]
    for dx, dy in d:
        yield x + dx, y + dy
    if block.direction:
        y += 2
    else:
        x += 2
    for dx, dy in d:
        yield x + dx, y + dy

def paintout(board, start, value):
    color = board[start.y][start.x]
    if color == 0:
        return
    que =[(start.x, start.y)]
    while que:
        x,y = que.pop()
        if board[y][x] == color:
            board[y][x] = value
            que.extend([(x + dx, y + dy) for dx, dy in [(-1, 0), (0, -1), (1, 0), (0, 1)]])


def is_reachable(size, start, goal, blocks):
    board = [[0] * (size.x + 2) for _ in range(size.y + 2)]
    for bi in blocks:
        for x, y in occupation_point(bi):
            board[y][x] = bi.color
    paintout(board, start, -1)
    return board[goal.y][goal.x] == -1


while True:
    size = Point(*map(int, readline().split()))
    if size.x == 0:
        break
    start = Point(*map(int, readline().split()))
    goal = Point(*map(int, readline().split()))
    blocks = []
    for _ in range(int(readline())):
        blocks.append(Block(*map(int, readline().split())))
    print('OK' if is_reachable(size, start, goal, blocks) else 'NG')