문제
Two Dots는 Playdots, Inc.에서 만든 게임이다. 게임의 기초 단계는 크기가 N×M인 게임판 위에서 진행된다.
각각의 칸은 색이 칠해진 공이 하나씩 있다. 이 게임의 핵심은 같은 색으로 이루어진 사이클을 찾는 것이다.
다음은 위의 게임판에서 만들 수 있는 사이클의 예시이다.
점 k개 d1, d2, ..., dk로 이루어진 사이클의 정의는 아래와 같다.
게임판의 상태가 주어졌을 때, 사이클이 존재하는지 아닌지 구해보자.
입력
첫째 줄에 게임판의 크기 N, M이 주어진다. 둘째 줄부터 N개의 줄에 게임판의 상태가 주어진다. 게임판은 모두 점으로 가득차 있고, 게임판의 상태는 점의 색을 의미한다. 점의 색은 알파벳 대문자 한 글자이다.
3 4
AAAA
ABCA
AAAA
출력
사이클이 존재하는 경우에는 "Yes", 없는 경우에는 "No"를 출력한다.
Yes
접근 방식
DFS로 모든 각 점에서 같은 점의 색을 탐색한다 (상하좌우에 현재 점의 색과 같고 방문을 안했을 시 방문)
탐색하면서 깊이를 측정해간다
탐색 도중 이미 방문했으면서 깊이가 4 이상이고 탐색 시작점의 위치와 같을 시 싸이클 변수를 True로 바꾼다
코드
# url : https://www.acmicpc.net/problem/16929
# 난이도 : gold 4
import sys
N,M = map(int,sys.stdin.readline().split())
mat = [[i for i in sys.stdin.readline().strip()] for _ in range(N)]
n = [0,-1,0,1]
m = [1,0,-1,0]
def dfs(node_n,node_m,depth):
global start, cycle
visited[node_n][node_m] = True
for i in range(4):
if 0<=n[i]+node_n<N and 0<=m[i]+node_m<M and mat[node_n][node_m] == mat[n[i]+node_n][m[i]+node_m] :
if visited[n[i]+node_n][m[i]+node_m] == False:
dfs(n[i]+node_n,m[i]+node_m,depth+1)
elif depth >= 4 and start[0] == n[i]+node_n and start[1] == m[i]+node_m:
cycle = True
return
answer = 'No'
cycle = False
for i in range(N):
for j in range(M):
visited = [[False for _ in range(M)] for _ in range(N)]
start = [i,j]
dfs(i,j,1)
if cycle == True:
answer = 'Yes'
break
print(answer)