백준 2234 성곽

wook2·2022년 6월 16일
0

알고리즘

목록 보기
105/117

https://www.acmicpc.net/problem/2234

bfs문제이다.
문제에서 구하라는 3가지를 구하면 된다.
이 문제는 친히 비트를 쓰라고 알려주고 있다.
이전에 해왔던 bfs로 영역표시 알고리즘을 쓰는데, 이동하려는 칸에 막대가 있다면 이동을 안하면 된다.
영역구분을 했다면 1번과 2번은 정답을 구할 수 있고
3번은 땅 하나하나 탐색해가며 상하좌우에 본인 번호와 다른 칸이 있다면 두 칸을 더해보고 그 값이 제일 큰 값을 찾으면 된다.

from collections import deque
n,m = map(int,input().split())
arr = []
for i in range(m):
    arr.append(list(map(int,input().split())))
visited = [[0]*n for i in range(m)]
dx = [0,-1,0,1]
dy = [-1,0,1,0]
ans = [0]*((n*m)+1)
def bfs():
    q = deque([])
    cnt = 0
    for i in range(m):
        for j in range(n):
            if not visited[i][j]:
                cnt += 1
                q.append((i,j))
                visited[i][j] = cnt
                while q:
                    x,y = q.popleft()
                    for k in range(4):
                        nx = x + dx[k]
                        ny = y + dy[k]
                        if nx < 0 or nx >= m or ny < 0 or ny >= n:
                            continue
                        if arr[x][y] & (1<<k) or visited[nx][ny] != 0:
                            continue
                        visited[nx][ny] = cnt
                        q.append((nx,ny))
    return cnt
print(bfs())
for i in range(m):
    for j in range(n):
        ans[visited[i][j]] += 1
g = max(ans)
print(g)
cs = g
for i in range(m):
    for j in range(n):
        for k in range(4):
            nx = i + dx[k]
            ny = j + dy[k]
            if nx < 0 or nx >= m or ny < 0 or ny >= n:
                continue
            if arr[i][j] & (1<<k) and visited[i][j] != visited[nx][ny]:
                cs = max(cs, ans[visited[i][j]]+ans[visited[nx][ny]])
print(cs)
profile
꾸준히 공부하자

0개의 댓글