[白俊]2667号:番号だけ貼る(Python)



質問する



私の答え

n=int(input())
g=[]
for i in range(n):
    g.append(list(map(int,input()))) #입력받은 값 저장

cnt=0

#상하좌우 탐색
dx=[1,-1,0,0]
dy=[0,0,-1,1]

def dfs(x,y):
    global cnt
    
    if x<0 or x>=n or y<0 or y>=n:#범위를 넘어선다면
        return False#반환

    if g[x][y]==1:#단지수 증가
        cnt+=1
        g[x][y]=0#방문한 지점을 0으로 바꿔 다시 방문하지 않도록 한다.
        for i in range(4):#상하좌우 이동
            nx=x+dx[i]
            ny=y+dy[i]
            dfs(nx,ny)#다시 탐색
        return True #탐색 종료
    
count=[]#단지 저장

for i in range(n): 
    for j in range(n):
        if dfs(i,j)==True:#탐색
            count.append(cnt)#cnt값 추가
            cnt=0 #초기화
            
count.sort()#오름차순 정렬
print(len(count))#개수 출력
for i in count:#단지 접근
    print(i)
方法
  • dfsの質問なので、改めて回答します.
  • dfs関数を定義すると、アクセス先は0になり、再アクセスを回避し、異なる家庭の数を計算します.
    訪れた場所を基準に、上下左右の探索を繰り返し、家があれば探索を続け、真理に戻る.
  • count配列記憶部は、n*nに対して繰り返し文アクセスを行い、真の値であればcount配列は家具の数(cnt)を記憶し初期化する.
  • 以降は昇順に並べられ、問題要件が出力される.