스터디/알고리즘
영역구하기
세졍
2024. 3. 18. 20:26
문제이해
M*N배열에서 직사각형이 있는 있는부분을 표시하고
직사각형이 없는 영역이 몇개인지,
그영역이 몇개의 칸인지 오름차순으로 출력
배열에서
0 2 4 4 (왼쪽아래좌표와,오른쪽위좌표주어질때) 그영역 칠하기 = ( x1,x2,y1,y2)
for i in (x1,x2):
for j in (y1,y2):
adj[j][i] = 1 * j랑 i 순서구분
M,N,K = map(int,input().split())
adj = [[0]*N for _ in range(M)]
visited = [[0]*N for _ in range(M)]
di = [-1,0,1,0]
dj = [0,1,0,-1]
def dfs(x,y):
stack = [(x,y)]
visited[x][y] = 1
area = 1
while stack:
(x,y) = stack[-1]
for d in range(4):
nx = x + di[d]
ny = y + dj[d]
if 0<=nx<M and 0<=ny<N and adj[nx][ny] == 0 and visited[nx][ny] == 0:
stack.append((nx,ny))
area += 1
visited[nx][ny] = 1
break
else:
stack.pop()
lst.append(area)
for _ in range(K):
x1,y1,x2,y2 = map(int,input().split())
for i in range(x1,x2):
for j in range(y1,y2):
adj[j][i] = 1
cnt = 0
lst = []
for i in range(M):
for j in range(N):
if adj[i][j] == 0 and visited[i][j] == 0:
cnt+= 1
dfs(i,j)
print(cnt)
lst.sort()
for i in lst:
print(i,end=' ')
<comment>
1.M이랑 N 바껴서 헷갈림...
2.직사각형 채우기 주의
3.1이없는 배열에서 0이면 영역cnt += 1하고 dfs돌려서 갯수세기