Skip to content

119 周赛 —— 有好题

第一题和第二题略,有时候我真的感觉一二题是拿来凑数的。

第三题虽然没做出来,但我认为是道好题,因为我居然直到最后一分钟才想到 DFS。虽然想到了,但也没法马上解决。

这个题解不错,他说出了我没想到的关键点——保留前一个位置。

【改写题解代码】

py
n, m = map(int, input().strip().split())
matrix = [input() for _ in range(n)]
# n,m = 3, 4
# matrix = [
#     'DDDD',
#     'DBCD',
#     'DDDD',]

"""
下一个点的要求:
    1. 只能是上下左右
    2. 位置不越界
    3. 不是前一个位置
    4. 颜色相同
"""
def get_next(x, y, prev_x, prev_y):
    tmp = [[x-1, y], [x+1, y], [x, y-1], [x, y+1]]
    res = []
    for nx, ny in tmp:
        if nx == prev_x and ny == prev_y:
            continue
        if 0<=nx<n and 0<=ny<m and matrix[x][y] == matrix[nx][ny]:
            res.append([nx, ny])
    return res

def dfs(x, y, prev_x, prev_y, steps, visited):
    visited[x][y] = True
    steps += 1
    nextXY = get_next(x, y, prev_x, prev_y)
    for nx, ny in nextXY:
        if visited[nx][ny] and steps >= 4:
            return True
        elif not visited[nx][ny]:
            if dfs(nx, ny, x, y, steps, visited):
                return True
    return False

def resolve():
    visited = [[False] * m for _ in range(n)]
    for i in range(n):
        for j in range(m):
            if not visited[i][j] and dfs(i, j, -1, -1, 0, visited):
                print("Yes")
                return
    print("No")

resolve()