백준/Search
[백준/bfs] 14502번: 연구실/ 다시 푼 것
ydin
2022. 5. 5. 22:05
-문제: https://www.acmicpc.net/problem/14502
14502번: 연구소
인체에 치명적인 바이러스를 연구하던 연구소에서 바이러스가 유출되었다. 다행히 바이러스는 아직 퍼지지 않았고, 바이러스의 확산을 막기 위해서 연구소에 벽을 세우려고 한다. 연구소는 크
www.acmicpc.net
전에 비해서는 이해가 갔다.
문제를 이해한 내용은
1. 바이러스의 위치정보 저장(굳이 필요 없었음)
2. 벽 3개를 임의의 위치에 세운다
3. 2 근방에 있는 모든 0을 2로 바꾼다
4. 전체 행렬에서 0의 갯수를 구한다
5. 위 단계를 반복하다가 0의 갯수의 최댓값을 출력한다
이다.
벽 3개를 어떻게 세워야 할지 몰랐는데, 이는 무작위로 0인 지점에 1 3개를 세우고 진행하면 된다.
그 다음 바이러스 주변에 있는 0들을 2로 바꾸어 준다(나는 bfs를 이용했다)
전체 데이터에서 0의 갯수를 구하는 함수를 구현한다
위 과정을 반복하면서 갯수의 최댓값을 구한후 출력하면 끝
-문제 풀다 헤맸던 것들
: answer=max ,return 라인 들여쓰지 않은 것
if nx,ny 라인도 들여쓰지 않은 것
pypy3으로 돌리지 않은 것
q.append(x,y)가 아닌 q.append((x,y))인것
from collections import deque
n,m= map(int,input().split())
data=[]
temp=[[0]*m for _ in range(n)]
answer=0
for i in range(n):
data.append(list(map(int,input().split())))
dx=[-1,1,0,0]
dy=[0,0,-1,1]
def virus(x,y):
q=deque()
q.append((x,y))
while q:
x,y=q.popleft()
for i in range(4):
nx,ny=x+dx[i],y+dy[i]
if 0<= nx <n and 0<=ny<m:
if temp[nx][ny]==0:
temp[nx][ny]=2
q.append((nx,ny))
def get_num():
num=0
for i in range(n):
for j in range(m):
if temp[i][j]==0:
num+=1
return num
def dfs(count):
global answer
if count==3:
for i in range(n):
for j in range(m):
temp[i][j]=data[i][j]
for i in range(n):
for j in range(m):
if temp[i][j]==2:
virus(i,j)
answer=max(answer,get_num())
return
for i in range(n):
for j in range(m):
if data[i][j]==0:
data[i][j]=1
count+=1
dfs(count)
data[i][j]=0
count-=1
dfs(0)
print(answer)