https://www.acmicpc.net/problem/3184
3184번: 양
첫 줄에는 두 정수 R과 C가 주어지며(3 ≤ R, C ≤ 250), 각 수는 마당의 행과 열의 수를 의미한다. 다음 R개의 줄은 C개의 글자를 가진다. 이들은 마당의 구조(울타리, 양, 늑대의 위치)를 의미한다.
www.acmicpc.net
<내 코드>
- 문제에서 #(울타리)는 이동하거나 넘어 갈 수 없어서 is_move배열에 움직일 수 있는 원소를 넣었다.
- visited 배열을 통해 방문처리를 하면서 중복을 방지함
- dfs 함수에서 아직 방문하지 않았고, 이동 가능한 경우에 양과 늑대의 수를 세어주고, 상하좌우로 dfs호출하여 그래프를 탐색한다.
- 메인 부분에서 dfs함수가 True를 리턴했을 때 양과 늑대의 수를 파악하여 result 배열에 넣어주고 다시 0으로 초기화한다.
import sys
sys.setrecursionlimit(10**9)
#입력
n,m = map(int, input().split())
graph = []
for _ in range(n):
graph.append(list(input()))
visited = [[False]*m for _ in range(n)]
is_move = ['.', 'o', 'v']
def dfs(x,y):
global wolf
global sheep
#영역 파악
if x>=n or x<0 or y>=m or y<0:
return False
if visited[x][y] == False and graph[x][y] in is_move:#아직 방문 안했고 이동가능
visited[x][y] = True#방문처리
if graph[x][y] == 'o':#양이라면
sheep+=1
elif graph[x][y] =='v':#늑대라면
wolf +=1
dfs(x,y+1)
dfs(x,y-1)
dfs(x+1,y)
dfs(x-1,y)
return True
return False
wolf =0
sheep = 0
result = [0,0] #양, 늑대
for i in range(n):
for j in range(m):
if dfs(i,j) == True:
if sheep > wolf:
wolf = 0
result[0] += sheep
result[1] += wolf
else:
sheep = 0
result[0] += sheep
result[1] += wolf
sheep = 0
wolf = 0
for r in result:
print(r, end = ' ')
'알고리즘 > DFS, BFS' 카테고리의 다른 글
[백준 -실버2] 7562번 나이트의 이동 (0) | 2022.01.23 |
---|---|
[백준-실버1] 1303번 전쟁-전투(DFS, 파이썬) (0) | 2022.01.20 |
[백준-골드4] 1987번 알파벳(BFS, 파이썬) (0) | 2022.01.14 |
[백준-실버1] 1697 숨바꼭질(파이썬, BFS) (0) | 2022.01.13 |
[백준-실버1] 7576 토마토(파이썬 , BFS) (0) | 2022.01.13 |