Buggy python submission (verdict: Runtime Error):
from collections import deque

def solve():
    H, W = map(int, input().split())
    A = [list(input()) for _ in range(H)]
    INF = 10 ** 9
    d = [[INF] * W for i in range(H)]
    d[0][0] = 1 if A[0][0] == '#' else 0

    def bfs():
        prepare = 1 if A[0][0] == '#' else 0
        q = deque([(0, 0, prepare)])
        while q:
            w, h, c = q.popleft()
            for a, b in [(1,0), (0,1)]:
                w_n, h_n = w+a, h+b
                if w_n >= W or h_n >= H: continue
                k = 1 if A[w_n][h_n] == '#' else 0
                if c+k >= d[h_n][w_n]: continue
                d[h_n][w_n] = c+k
                q.append((w_n, h_n, c+k))
    bfs()
    return d[H-1][W-1]

print(solve())

Fixed submission:
from collections import deque

def solve():
    H, W = map(int, input().split())
    A = [list(input()) for _ in range(H)]
    INF = 10 ** 9
    d = [[INF] * W for i in range(H)]
    d[0][0] = 1 if A[0][0] == '#' else 0

    prepare = 1 if A[0][0] == '#' else 0
    q = deque([(prepare, 0, 0)])
    while q:
        c, x, y = q.popleft()
        for a, b in [(1,0), (0,1)]:
            nx, ny = x+a, y+b
            if nx >= W or ny >= H: continue
            k = 1 if A[y][x] != A[ny][nx] else 0
            if c+k >= d[ny][nx]: continue
            d[ny][nx] = c+k
            q.append((c+k, nx, ny))

    return (d[H-1][W-1]+1)//2

print(solve())

Buggy python submission (verdict: Runtime Error):
from collections import deque

def solve():
    H, W = map(int, input().split())
    A = [list(input()) for _ in range(H)]
    INF = 10 ** 9
    d = [[INF] * W for i in range(H)]
    d[0][0] = 1 if A[0][0] == '#' else 0

    def bfs():
        prepare = 1 if A[0][0] == '#' else 0
        q = deque([(0, 0, prepare)])
        while q:
            w, h, c = q.popleft()
            for a, b in [(1,0), (0,1)]:
                w_n, h_n = w+a, h+b
                if w_n >= W or h_n >= H: continue
                k = 1 if A[w_n][h_n] == '#' else 0
                if c+k >= d[h_n][w_n]: continue
                d[h_n][w_n] = c+k
                q.append((w_n, h_n, c+k))
    bfs()
    return d[W-1][H-1]

print(solve())

Fixed submission:
from collections import deque

def solve():
    H, W = map(int, input().split())
    A = [list(input()) for _ in range(H)]
    INF = 10 ** 9
    d = [[INF] * W for i in range(H)]
    d[0][0] = 1 if A[0][0] == '#' else 0

    prepare = 1 if A[0][0] == '#' else 0
    q = deque([(prepare, 0, 0)])
    while q:
        c, x, y = q.popleft()
        for a, b in [(1,0), (0,1)]:
            nx, ny = x+a, y+b
            if nx >= W or ny >= H: continue
            k = 1 if A[y][x] != A[ny][nx] else 0
            if c+k >= d[ny][nx]: continue
            d[ny][nx] = c+k
            q.append((c+k, nx, ny))

    return (d[H-1][W-1]+1)//2

print(solve())

Buggy python submission (verdict: Runtime Error):
from collections import deque

def solve():
    H, W = map(int, input().split())
    A = [list(input()) for _ in range(H)]
    INF = 10 ** 9
    d = [[INF] * W for i in range(H)]
    d[0][0] = 1 if A[0][0] == '#' else 0

    def bfs():
        prepare = 1 if A[0][0] == '#' else 0
        q = deque([(0, 0, prepare)])
        while q:
            w, h, c = q.popleft()
            for a, b in [(1,0), (0,1)]:
                w_n, h_n = w+a, h+b
                if w_n >= W or h_n >= H: continue
                k = 1 if A[w_n][h_n] == '#' else 0
                if c+k >= d[h_n][w_n]: continue
                d[h_n][w_n] = c+k
                q.append((w_n, h_n, c+k))
    bfs()
    return d[-1][-1]

print(solve())

Fixed submission:
from collections import deque

def solve():
    H, W = map(int, input().split())
    A = [list(input()) for _ in range(H)]
    INF = 10 ** 9
    d = [[INF] * W for i in range(H)]
    d[0][0] = 1 if A[0][0] == '#' else 0

    prepare = 1 if A[0][0] == '#' else 0
    q = deque([(prepare, 0, 0)])
    while q:
        c, x, y = q.popleft()
        for a, b in [(1,0), (0,1)]:
            nx, ny = x+a, y+b
            if nx >= W or ny >= H: continue
            k = 1 if A[y][x] != A[ny][nx] else 0
            if c+k >= d[ny][nx]: continue
            d[ny][nx] = c+k
            q.append((c+k, nx, ny))

    return (d[H-1][W-1]+1)//2

print(solve())

Buggy python submission (verdict: Time Limit Exceeded):
from collections import deque

def solve():
    H, W = map(int, input().split())
    A = [list(input()) for _ in range(H)]
    INF = 10 ** 9
    d = [[INF] * W for i in range(H)]
    d[0][0] = 0

    def bfs(x,y,G):
        prepare = 1 if A[y][x] == '#' else 0
        q = deque([(x, y, prepare)])
        MOVE = [(1,0), (0,1)]
        while q:
            z = q.popleft()
            
            for (a, b) in MOVE:
                w, h, c = z
                w_n, h_n = w+a, h+b

                if w_n >= W or h_n >= H:
                    continue
                if A[h_n][w_n] == '#':
                    c += 1
                
                d[h_n][w_n] = min(d[h_n][w_n], c)
                q.append((w_n, h_n, c))

    bfs(0, 0, A)
    return d[H-1][W-1]

print(solve())

Fixed submission:
from collections import deque

def solve():
    H, W = map(int, input().split())
    A = [list(input()) for _ in range(H)]
    INF = 10 ** 9
    d = [[INF] * W for i in range(H)]
    d[0][0] = 1 if A[0][0] == '#' else 0

    prepare = 1 if A[0][0] == '#' else 0
    q = deque([(prepare, 0, 0)])
    while q:
        c, x, y = q.popleft()
        for a, b in [(1,0), (0,1)]:
            nx, ny = x+a, y+b
            if nx >= W or ny >= H: continue
            k = 1 if A[y][x] != A[ny][nx] else 0
            if c+k >= d[ny][nx]: continue
            d[ny][nx] = c+k
            q.append((c+k, nx, ny))

    return (d[H-1][W-1]+1)//2

print(solve())

Buggy python submission (verdict: Time Limit Exceeded):
from collections import deque

def solve():
    H, W = map(int, input().split())
    A = [list(input()) for _ in range(H)]
    INF = 10 ** 9
    d = [[INF] * W for i in range(H)]
    d[0][0] = 0

    def bfs(x,y,G):
        prepare = 1 if A[y][x] == '#' else 0
        q = deque([(x, y, prepare)])
        MOVE = [(1,0), (0,1)]
        while q:
            z = q.popleft()
            
            for (a, b) in MOVE:
                w, h, c = z
                w_n, h_n = w+a, h+b

                if w_n >= W or h_n >= H:
                    continue
                if A[h_n][w_n] == '#':
                    c += 1
                
                d[h_n][w_n] = min(d[h_n][w_n], c)
                q.append((w_n, h_n, c))

    bfs(0, 0, A)
    return d[H-1][W-1]

print(solve())

Fixed submission:
from collections import deque

def solve():
    H, W = map(int, input().split())
    A = [list(input()) for _ in range(H)]
    INF = 10 ** 9
    d = [[INF] * W for i in range(H)]
    d[0][0] = 1 if A[0][0] == '#' else 0

    prepare = 1 if A[0][0] == '#' else 0
    q = deque([(prepare, 0, 0)])
    while q:
        c, x, y = q.popleft()
        for a, b in [(1,0), (0,1)]:
            nx, ny = x+a, y+b
            if nx >= W or ny >= H: continue
            k = 1 if A[y][x] != A[ny][nx] else 0
            if c+k >= d[ny][nx]: continue
            d[ny][nx] = c+k
            q.append((c+k, nx, ny))

    return (d[H-1][W-1]+1)//2

print(solve())