문제
정사각형으로 이루어져 있는 섬과 바다 지도가 주어진다. 섬의 개수를 세는 프로그램을 작성하시오.
한 정사각형과 가로, 세로 또는 대각선으로 연결되어 있는 사각형은 걸어갈 수 있는 사각형이다.
두 정사각형이 같은 섬에 있으려면, 한 정사각형에서 다른 정사각형으로 걸어서 갈 수 있는 경로가 있어야 한다. 지도는 바다로 둘러싸여 있으며, 지도 밖으로 나갈 수 없다.
input
1 1
0
2 2
0 1
1 0
3 2
1 1 1
1 1 1
5 4
1 0 1 0 0
1 0 0 0 0
1 0 1 0 1
1 0 0 1 0
5 4
1 1 1 0 1
1 0 1 0 1
1 0 1 0 1
1 0 1 1 1
5 5
1 0 1 0 1
0 0 0 0 0
1 0 1 0 1
0 0 0 0 0
1 0 1 0 1
0 0
output
0
1
1
3
1
9
import sys
def bfs(arr, x, y, wh):
q = [(x, y)]
while len(q) != 0:
s = q.pop(0)
a = s[0]
b = s[1]
if a+1 < wh[0] and arr[a+1][b] and not visited[a+1][b]:
visited[a+1][b] = True
q.append((a+1, b))
if a-1 > -1 and arr[a-1][b] and not visited[a-1][b]:
visited[a-1][b] = True
q.append((a-1, b))
if b+1 < wh[1] and arr[a][b+1] and not visited[a][b+1]:
visited[a][b+1] = True
q.append((a, b+1))
if b-1 > -1 and arr[a][b-1] and not visited[a][b-1]:
visited[a][b-1] = True
q.append((a, b-1))
if a-1 > -1 and b-1 > -1 and arr[a-1][b-1] and not visited[a-1][b-1]:
visited[a-1][b-1] = True
q.append((a-1, b-1))
if a+1 < wh[0] and b-1 > -1 and arr[a+1][b-1] and not visited[a+1][b-1]:
visited[a+1][b-1] = True
q.append((a+1, b-1))
if a-1 > -1 and b+1 < wh[1] and arr[a-1][b+1] and not visited[a-1][b+1]:
visited[a-1][b+1] = True
q.append((a-1, b+1))
if a+1 < wh[0] and b+1 < wh[1] and arr[a+1][b+1] and not visited[a+1][b+1]:
visited[a+1][b+1] = True
q.append((a+1, b+1))
input = sys.stdin.readline
wh = []
testcases = []
visited = [[False] * 50 for _ in range(50)]
answer = 0
while True:
w, h = map(int, input().split())
if w == 0 and h == 0:
break
wh.append((h, w))
testcases.append([list(map(int, input().split())) for _ in range(h)])
for num in range(len(wh)):
visited = [[False] * 50 for _ in range(50)]
answer = 0
for x in range(wh[num][0]):
for y in range(wh[num][1]):
if testcases[num][x][y] and not visited[x][y]:
visited[x][y] = True
bfs(testcases[num], x, y, wh[num])
answer += 1
print(answer)