[伯俊/python/1194]月が昇ってきたから行こう



質問リンク:月が昇ったから行こう
長い議論から問題の物語を初めて読んだとき、私は理解しなかった.よく見ると迷宮問題です.他の問題とは異なり、アルファベットキーを使用できます.
import sys
from collections import deque

input=sys.stdin.readline
n,m=map(int, input().split())
dx=[0,0,-1,1]
dy=[1,-1,0,0]

def bfs():
    while q:
        x,y,c,cnt=q.popleft()
        for i in range(4):
            nx=x+dx[i]
            ny=y+dy[i]
            if 0<=nx<n and 0<=ny<m and miro[nx][ny]!="#" and visit[nx][ny][c]==0:
                if miro[nx][ny]==".":
                    visit[nx][ny][c]=1
                    q.append([nx,ny,c,cnt+1])
                elif miro[nx][ny]=="1":
                    return cnt+1
                else:
                    if miro[nx][ny].isupper():
                        if c&1<<(ord(miro[nx][ny])-65):
                            visit[nx][ny][c]=1
                            q.append([nx,ny,c,cnt+1])
                    elif miro[nx][ny].islower():
                        nc=c|(1<<ord(miro[nx][ny])-97)
                        if visit[nx][ny][nc]==0:
                            visit[nx][ny][nc]=1
                            q.append([nx,ny,nc,cnt+1])
    return -1
q=deque()
miro = []
visit=[[[0]*64 for i in range(m)]for i in range(n)]
for i in range(n):
    a=list(input().strip())
    miro.append(a)
    for j in range(m):
        if a[j]=="0":
            q.append([i,j,0,0])
            miro[i][j]="."
            visit[i][j][0]=1
print(bfs())
身長を見分ける過程が難しすぎる.だから他の人のブログを参考にしました.

こちらはバイナリで表しています.
1<<(「A」)-65)の場合は1->1
1<<(「B」)-65)の場合2>10
1<<(「C」)-65)の場合は4->100
そうです.小文字も同じです.
&これらの進数をand演算するので、複数の鍵を拾うと結合します.
A、B、Dキーがある場合は->1011
|これらの整数をorで演算するため、鍵を使用します.
1011でbを使用する場合->1001
うん.狩猟するすべて