题单
青蛙跳杯子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)
(未完待续。。。)
浙公网安备 33010602011771号