题单

青蛙跳杯子102,发现环108,合根植物110,填字母游戏113,机器人塔118.四平方和122,取球博弈123,卡片换位125、生命之树131,穿越雷区141、长草149、小朋友崇拜圈182,剪格子211,版本分支223,迷宫与陷阱229,调手表230,分考场237,最长子序列244,九宫重排261,网络寻路263危险系数264,约数倍数选卡片265,字母阵列621,魔方状态643,算式649,凑平方数653,方格填数664,完美正方形685,五星填数687,生成回文数691走迷宫1216,N皇后问题1508,最少操作数1509。

以下是题解部分,文字部分就不多废话了。

青蛙跳杯子

BFS。

import sys
from collections import deque

st=input()
ed=input()
all_map=set()
all_map.add(st)

pace=[-3,-2,-1,1,2,3]

q=deque()
q.append([list(st),0]) # 放当前局面和步数

while q:
    cmap,cstep=q.popleft()
    ind=cmap.index("*")
    for p in pace:
        if 0<=ind+p<len(cmap):
            nmap=cmap.copy()
            nmap[ind],nmap[ind+p]=nmap[ind+p],nmap[ind]
            nstep=cstep+1
            snmap="".join(nmap)
            if snmap==ed:
                print(nstep)
                sys.exit(0)
            if snmap not in all_map:
                all_map.add(snmap)
                q.append([nmap,nstep])
    
    

发现环

思路:

1.使用邻接表存储某个节点连接的点。

2.记录每个节点入度/出度(就是与它相连有多少个点)。

3.从入度为1的点用DFS或BFS开始遍历邻接点,并把邻接点的入度-1。如果此时邻接点入度变为1,则它的邻接点需要被遍历。

4.在此过程中用vis数组记录所有入度为1的点。

5.记录没有被vis数组记录的点,并排序,之后打印。

BFS写法

from collections import deque

n=int(input())
edge=[[] for i in range(n+1)]
d=[0]*(n+1)
vis=[0]*(n+1)

for _ in range(n):
    a,b=map(int,input().split())
    edge[a].append(b)
    edge[b].append(a)
    d[a]+=1
    d[b]+=1

q=deque()
for i in range(1,n+1):
    if d[i]==1:
        q.append(i)
        vis[i]=1

while q:
    c=q.popleft()
    for e in edge[c]:
        d[e]-=1
        if d[e]==1:
            vis[e]=1
            q.append(e)

ring=[]
for i in range(1,n+1):
    if not vis[i]:
        ring.append(i)

ring.sort()
print(*ring)

DFS写法

def dfs(i):
    vis[i]=1
    for j in edge[i]:
        d[j]-=1
        if d[j]==1:
            dfs(j)

n=int(input())
edge=[[] for i in range(n+1)]
d=[0]*(n+1)
vis=[0]*(n+1)

for _ in range(n):
    a,b=map(int,input().split())
    edge[a].append(b)
    edge[b].append(a)
    d[a]+=1
    d[b]+=1

for i in range(1,n+1):
    if d[i]==1:
        dfs(i)

ring=[]
for i in range(1,n+1):
    if not vis[i]:
        ring.append(i)

ring.sort()
print(*ring)

(未完待续。。。)

posted on 2023-05-21 12:26  快乐的乙炔  阅读(0)  评论(0)    收藏  举报  来源