其他分享
首页 > 其他分享> > 第十三届蓝桥杯模拟赛 1 期 平面图连通

第十三届蓝桥杯模拟赛 1 期 平面图连通

作者:互联网

问题描述
  著名设计师小蓝给蓝桥小学设计了一个教学楼。
  蓝桥小学经常下雨,所以校长希望教学楼任何地方都可以连通到其它地方。
  小蓝给出了教学楼的平面图,用一个 n 行 m 列的 01 矩阵表示,其中 0 表示空地,1 表示教学楼。两个相邻的 1 (上下相邻或左右相邻)之间互相可达。
  请帮小蓝检查一下,是否教学楼的任意两个地方都可以连通到其它地方。
输入格式
  输入的第一行包含两个整数 n, m,用一个空格分隔。
  接下来 n 行,每行一个长度为 m 的 01 串,表示教学楼的平面图。
输出格式
  如果满足要求,输出“YES”,否则输出“NO”,请注意字母全部都是大写。
n, m = map(int, input().split())  # 读入输入的行列,和n行每行一个长度为 m 的 01 串
hang = []
All = []
for i in range(n):
    hang = list(map(int, input()))
    All.append(hang)

visit = [[0 for i in range(m)] for j in range(n)]  # visit矩阵来记录走过的位置


def DFS(x, y):
    visit[x][y] = 1  # 表示此点已经搜索过
    fangxiang = [[x - 1, y], [x + 1, y], [x, y - 1], [x, y + 1]]
    for dx, dy in fangxiang:
        if dx < 0 or dx > n - 1 or dy < 0 or dy > m - 1:
            continue  # 如果是边框,跳过此方向
        elif visit[dx][dy] == 0:
            if All[dx][dy] == 0:
                continue
            elif All[dx][dy] == 1:
                DFS(dx, dy)
        elif visit[dx][dy] == 1:
            continue
    return


def find():
    for i in range(n):
        for j in range(m):
            if All[i][j] == 1:
                DFS(i, j)
                return


find()

if All == visit:
    print("YES")
else:
    print("NO")

在网上找了个遍都没找到python版本的,没办法,自己写吧

思路参考:深度优先搜索及python实现围棋“吃子”_吃草的哥哥哥斯拉的博客-CSDN博客_python围棋算法

标签:平面图,visit,蓝桥,range,dx,dy,教学楼,第十三届
来源: https://blog.csdn.net/m0_50890098/article/details/123605856