Le douzième jour d'apprentissage du python --- Xiaolan (3)

1. Labyrinthe (DFS)

insérez la description de l'image ici

print("DDDDRRURRRRRRDRRRRDDDLDDRDDDDDDDDDDDDRDDRRRURRUURRDDDDRDRRRRRRDRRURRDDDRRRRUURUUUUUUULULLUUUURRRRUULLLUUUULLUUULUURRURRURURRRDDRRRRRDDRRDDLLLDDRRDDRDDLDDDLLDDLLLDLDDDLDDRRRRRRRRRDDDDDDRR")
n, m = 30, 50
a = [[0 for i in range(m)] for j in range(n)]
vis = [[100000 for i in range(m)] for j in range(n)]
t = [[0 for i in range(m)] for j in range(n)]
for i in range(n):
    res = input()
    for j in range(m):
        a[i][j] = res[j]

dx = [0, -1, 1, 0]
dy = [1, 0, 0, -1]
c = ["R", "U", "D", "L"]
pos = 0
res = [" " for i in range(100000)]
ans = 100000000
ss = ""

def pd(x, y):
    if x < 0 or x >= n or y < 0 or y >= m or a[x][y] == '1' or t[x][y] != 0:
        return False
    else:
        return True


def DFS(x, y, pos):
    global ans, ss
    if pos > ans:
        return
    if x == 29 and y == 49:
        s = "".join(res[:pos])
        if ans > pos:
            ans = pos
            ss = s
        elif pos == ans and s < ss:
            ss = s
        return
    for i in range(4):
        nx = x + dx[i]
        ny = y + dy[i]
        if pd(nx, ny) and pos + 1 <= vis[nx][ny]:
            t[nx][ny] = 1
            vis[nx][ny] = pos + 1
            res[pos] = c[i]
            DFS(nx, ny, pos + 1)
            t[nx][ny] = 0


t[0][0] = 1
vis[0][0] = 0
DFS(0, 0, 0)
print(ss)

2. Sauterelle sautante (BFS)

insérez la description de l'image ici
Changeons d'abord cette question. Au début, c'est un saut de sauterelle, puis il est changé en un saut d'assiette vide,
puis le poids est jugé.

def insertq(q,dir,news,vis):
    pos=news[1]#0的位置
    status=news[0]
    insertpos=(pos+dir+9)%9#找到0应该放的位置
    #将字符串转为列表
    t=list(status)
    t[pos],t[insertpos]=t[insertpos],t[pos]
    addStatus="".join(t)
    if addStatus not in vis:
        vis.add(addStatus)
        q.append((addStatus,insertpos,news[2]+1))


q=[("012345678",0,0)]#模拟队列
vis=set()#用来判重
vis.add("012345678")
while q:
    news=q.pop(0)
    if news[0]=="087654321":#说明到了目标状态,输出最少步数
        print(news[2])
        break
    insertq(q,-2,news,vis)
    insertq(q, -1, news, vis)
    insertq(q, 1, news, vis)
    insertq(q, 2, news, vis)

Comment utiliser l'ensemble

# set 的定义 变量名=set()
intSet = set()
stringSet = set()

s1 = "测试1"
s2 = "测试2"
s3 = "测试3"

# 2. 插入操作
stringSet.add(s3)
stringSet.add(s2)

# 5.返回集合元素数量
print("前2次插入操作完成后的元素数量为%d\n" % len(stringSet))  # 注意这里要使用 % 进行格式化输出
stringSet.add(s1)
print("前3次插入操作完成后的元素数量为%d\n" % len(stringSet))

# 6.遍历整个集合
for ele in stringSet:
    print(ele, end=' ')
print()

# 3. 删除操作
stringSet.discard(s3)

print("删除操作完成后的元素数量为%d\n" % len(stringSet))
for ele in stringSet:
    print(ele, end=' ')
print()

# 4. 判断是否存在此元素
if s2 in stringSet:
    print("存在元素")
else:
    print("不存在元素")

dictionnaire python

La carte équivalente à C++
n'est pas appelée une carte en Python, ni une carte. Nous l'appelons un dictionnaire. L'utilisation est différente de Java et C++.

  1. Création de dictionnaire.
massege={
    
    '小':'123124543643','xiaohua':'17855666','LiMing':'1249699859456'}

#或者创建空的字典
empty_dict = {
    
    }
#或者使用元组作为key
group_dict = {
    
    (60, 99):'good', 100:'nice'}
  1. Ajout de dictionnaires.
# 如果字典内不含有相应的Key值,则会执行添加操作
dict[key]=value
  1. Modification du dictionnaire.
# 如果字典内含有相应的Key值,则会执行更新操作
dict[key]=new_value

# 使用update()修改
# update() 方法可使用一个字典所包含的 key-value 对来更新己有的字典。如果有就修改,没有就添加。
dict.update({
    
    'key':123,'key2':234})
  1. Suppression du dictionnaire.
del dict['key']  # 删除键是'key'的条目
dict.clear()      # 清空字典所有条目
del dict          # 删除字典
  1. Accès au dictionnaire.
dict = {
    
    'Name': 'Zara', 'Age': '7'} 
print (dict['Name'])

#当然如果key值不存在,将会抛出异常
#也可以是用get()方法,不存在会返回None,但不会抛出异常
print(dict.get('Name')) 

3. Code à sept segments (DFS+ et ensemble de recherche)

insérez la description de l'image ici

n,ans=10,0
use=[0 for i in range(n)]
e=[[0 for i in range(n)]for j in range(n)]
fa=[0 for i in range(n)]

def init():
    # 连边建图,e[i][j] == 1  表示第i段和第j段灯管相邻
    # a b c d e f g
    # 1 2 3 4 5 6 7
    e[1][2]=e[1][6]=1
    e[2][1]=e[2][7]=e[2][3]=1
    e[3][2]=e[3][4]=e[3][7]=1
    e[4][3]=e[4][5]=1
    e[5][4]=e[5][6]=e[5][7]=1
    e[6][1]=e[6][5]=e[6][7]=1
    e[7][2]=e[7][3]=e[7][5]=e[7][6]=1

def find(u):
    if fa[u]==u:
        return u
    fa[u]=find(fa[u])
    return fa[u]

def dfs(d):
    global ans
    if d>7:
        for i in range(1,7+1):
            fa[i]=i#初始化
        for i in range(1,7+1):
            for j in range(1,7+1):
                if e[i][j] and use[i] and use[j]:
                    fx=find(i)
                    fy=find(j)
                    if fx!=fy:
                        fa[fx]=fy
        k=0
        for i in range(1,7+1):
            if use[i] and fa[i]==i:
                k+=1
        if k==1:
            ans+=1#说明所有亮灯属于一个集合
        return
    use[d]=1#打开这个灯
    dfs(d+1)
    use[d]=0#关闭这个灯
    dfs(d+1)

init()
dfs(1)
print(ans)

Et rechercher

insérez la description de l'image ici
insérez la description de l'image ici
initialisation

maxn=200
fa=[]
def init():
    for i in range(maxn+1):
        fa.append(i)

Renseigner


def find(x):
    if fa[x]==x:
        return x
    else:
        return find(fa[x])

Les requêtes avec compression de chemin peuvent faire gagner beaucoup de temps

def find(x):
    if fa[x]==x:
        return x
    else:
        fa[x]=find(fa[x])
        return fa[x]

fusionner

def merge(x,y):
    fa[find(x)]=find(y)

4. Plantes à racines combinées (et vérification)

insérez la description de l'image ici

n,m=map(int,input().split())
k=int(input())
t=1
fa=[]

def init():
    for i in range(m*n+5):
        fa.append(i)
def find(x):
    if fa[x]==x:
        return x
    else:
        fa[x]=find(fa[x])
        return fa[x]

def merge(x,y):
    fa[find(x)]=find(y)

init()

for i in range(k):
    x,y=map(int,input().split())
    merge(x,y)
ans=0

for i in range(m*n):
    index=i+1
    if(fa[index]==index):
        ans+=1
print(ans)

Cinq, pierres sautantes (entier de deux points)

insérez la description de l'image ici

Le plus court est le plus long - deux points

l,n,m=map(int,input().split())
a=[]
for i in range(n):
    t=int(input())
    a.append(t)
a.append(l)
left,right=0,l

def check(u):
    res=0
    pos=0
    for i in range(0,n+1):
        if a[i]-pos<u:
            res+=1
        else:
            pos=a[i]
    if res<=m:
        return True
    return False


while left<right:
    mid=(left+right+1)//2
    # print(mid)
    if check(mid):
        left=mid
    else:
        right=mid-1
print(left)

Je suppose que tu aimes

Origine blog.csdn.net/qq_51408826/article/details/129897548
conseillé
Classement