본문 바로가기

알고리즘

백준4963)섬의 개수-python

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

 

import sys
read = sys.stdin.readline
sys.setrecursionlimit(10000)

def dfs(x,y,visit,arr):
  visit[x][y] = True

  dx = [0,0,1,-1,-1,-1,1,1]
  dy = [1,-1,0,0,-1,1,-1,1]

  for i in range(len(dx)):
    nx = dx[i] + x
    ny = dy[i] + y

    if (0 <= nx < len(arr)) and (0 <= ny < len(arr[0])):
      if arr[nx][ny] == 1 and visit[nx][ny] == False:
        dfs(nx,ny,visit,arr)




while True:
  arr = []
  n,m = map(int,input().split())
  if n == 0 and m == 0:
    break

  for _ in range(m):
    arr.append(list(map(int, read().split())))

  visit = [[False] * n for _ in range(m)]

  count = 0

  for i in range(len(arr)):
    for j in range(len(arr[0])):
      if visit[i][j] == False:
        if arr[i][j] == 1:
          dfs(i,j,visit,arr)
          count += 1

  print(count)

해당 문제는 dfs의 상,하,좌,우에 대각선만 추가해주면 끝이난다.

그리고 while이 True로 무한반복인점을 고려해 탈출조건을 명확히 무조건 명시해줘야 한다.