更弱智的算法学习 day53

python 复制代码
def judge(s1,s2):
    count=0
    for i in range(len(s1)):
        if s1[i]!=s2[i]:
            count+=1
    return count==1

# 作用​:判断两个字符串 s1和 s2是否恰好只有一个字符不同。
# ​细节​:遍历两个字符串的每个字符,统计不同字符的数量。如果最终计数为 1,则返回 True,否则返回 False。

if __name__=='__main__':
    n=int(input())
    beginstr,endstr=map(str,input().split())
    if beginstr==endstr:
        print(0)
        exit()
    strlist=[]
    for i in range(n):
        strlist.append(input())
    
    # use bfs
    visit=[False for i in range(n)]
    queue=[[beginstr,1]]
    while queue:
        str,step=queue.pop(0)
        if judge(str,endstr):
            print(step+1)
            exit()
        for i in range(n):
            if visit[i]==False and judge(strlist[i],str):
                visit[i]=True
                queue.append([strlist[i],step+1])

# 初始化​:
# visit数组标记 strlist中的字符串是否已被访问。
# 队列 queue存储待处理的字符串及其当前步数(从 beginstr到该字符串的序列长度)。初始为 [beginstr, 1]。

# ​BFS 循环​:
# 弹出队首元素,得到当前字符串 str和步数 step。
# 如果 str能直接转换到 endstr,则输出 step+1(加上 endstr)并结束。
# 否则,遍历 strlist,找到未访问且与 str相差一个字符的字符串,标记为已访问并入队(步数加 1)。
# ​队列为空​:说明无法转换,输出 0。
    print(0)
python 复制代码
import collections

path = set()  # 纪录 BFS 所经过之节点

def bfs(root, graph):
    global path
    
    que = collections.deque([root])
    while que:
        cur = que.popleft()
        path.add(cur)
        
        for nei in graph[cur]:
            que.append(nei)
        graph[cur] = []
    return
# 使用deque作为队列,从根节点开始
# 每访问一个节点,就将其加入path集合
# 遍历当前节点的所有邻居,加入队列
def main():
    N, K = map(int, input().strip().split())
    graph = collections.defaultdict(list)
    for _ in range(K):
        src, dest = map(int, input().strip().split())
        graph[src].append(dest)
    
    bfs(1, graph)
    if path == {i for i in range(1, N + 1)}:
        return 1
    return -1
        

if __name__ == "__main__":
    print(main())
python 复制代码
n, m = map(int, input().split())
graph = []
for _ in range(n):
    graph.append(list(map(int, input().split())))

perimeter = 0

for i in range(n):
    for j in range(m):
        if graph[i][j] == 1:  # 陆地
            # 检查四个方向
            # 上方
            if i == 0 or graph[i-1][j] == 0:
                perimeter += 1
            # 下方
            if i == n-1 or graph[i+1][j] == 0:
                perimeter += 1
            # 左方
            if j == 0 or graph[i][j-1] == 0:
                perimeter += 1
            # 右方
            if j == m-1 or graph[i][j+1] == 0:
                perimeter += 1

print(perimeter)
相关推荐
HellowAmy2 小时前
我的C++规范 - 回调的设想
开发语言·c++·代码规范
Java程序员威哥2 小时前
SpringBoot多环境配置实战:从基础用法到源码解析与生产避坑
java·开发语言·网络·spring boot·后端·python·spring
mudtools2 小时前
C#中基于Word COM组件的数学公式排版实践
开发语言·c#·word
yayatiantian_20222 小时前
Ubuntu 24.04 安装与配置 pyenv
linux·运维·python·ubuntu·pyenv
Q741_1472 小时前
C++ 优先级队列 大小堆 模拟 力扣 1046. 最后一块石头的重量 每日一题
开发语言·c++·算法·leetcode·优先级队列·
一个处女座的程序猿O(∩_∩)O2 小时前
Next.js 与 React 深度解析:为什么选择 Next.js?
开发语言·javascript·react.js
KiefaC2 小时前
【C++】特殊类设计
开发语言·c++
June bug2 小时前
【python基础】常见的数据结构的遍历
开发语言·数据结构·python
冬奇Lab2 小时前
【Kotlin系列14】编译器插件与注解处理器开发:在编译期操控Kotlin
android·开发语言·kotlin·状态模式