bfs 문제이다.
from collections import deque
dx=[0,0,1,-1] # 상하좌우로 이동하므로
dy=[1,-1,0,0]
res=[]
for m in range(int(input())):
tmpli=[]
tmp=""
N=int(input())
li=[[0]*(N+1)]
visit=[[0]*(N+1) for i in range(N+1)]
for i in range(N):
li.append([0]+list(map(int,input().split())))
for i in range(1,N+1):
for j in range(1,N+1):
size=[0,0,0] #초기값 선언
if li[i][j]!=0 and visit[i][j]==0: #해당구역에 화학물질이 있고 처음방문할 경우
q=deque()
q.append((i,j))
visit[i][j]=1
size=[size[0]+1,[i,j],[0,0]] #크기갱신, 직사각형의 왼쪽위값 갱신
while q:
x,y=q.popleft()
for k in range(4): #상하좌우 방문
nx=x+dx[k]
ny=y+dy[k]
if 1<=nx<=N and 1<=ny<=N:
if li[nx][ny]!=0 and visit[nx][ny]==0: #해당구역에 화학물질이 있고 처음방문할 경우
visit[nx][ny]=1 #방문처리
q.append((nx,ny))
size[0]+=1 # 크기갱신
size[2]=[nx,ny] if nx>=size[2][0] and ny>=size[2][1] else size[2] #조건부로 직사각형의 오른쪽하단값 갱신(x,y) 둘다 가장 큰값
if size[0]:
tmpli.append([size[0],size[2][0]-size[1][0]+1,size[2][1]-size[1][1]+1]) # 해당구역값을 추가해줌([크기,x의길이,y의길이])
tmpli.sort(key=lambda x:(x[0],x[1])) #2차원정렬, x[0]오름차 -> x[1] 오름차순
tmp+=str(len(tmpli))+" "
for i in tmpli:
tmp+=str(i[1])+" "+(str(i[2])+" " if i[1]!=i[2] else "")
res.append(tmp)
for i in range(len(res)):
print("#%d %s"%(i+1,res[i]))