이번 문제는 깊이우선탐색을 통해 해결하였다. 깊이우선탐색을 하는 과정에서 사이클의 조건을 생각하는데에 시간이 조금 걸렸다. 사이클의 조건은 다음과 같이 도출되었다.
탐색 도중에 위의 조건에 만족할 경우 Yes를 출력할 수 있도록 값을 갱신하였다. 그리고 또 중요한 것은 재귀호출을 하기 전에 탐색할 다음 노드의 방문처리를 해준 뒤에 재귀호출 이후에 다시 방문 전으로 바꿔주어 다음 탐색 시에 영향이 없도록 해야 한다.
y+dy[i]
로 저장한다.x+dx[i]
로 저장한다.board[ny][nx]
가 board[y][x]
와 같고 visited[ny][nx]
가 False일 경우,visited[ny][nx]
를 True로 갱신한다.dfs(ny, nx, sy, sx, cnt+1)
을 재귀호출한다.visited[ny][nx]
를 False로 갱신한다.visited[i][j]
를 True로 갱신한다.dfs(i, j, i, j, 1)
을 호출한다.def dfs(y, x, sy, sx, cnt):
global answer
dy=[0, 0, -1, 1]
dx=[1, -1, 0, 0]
for i in range(4):
ny=y+dy[i]
nx=x+dx[i]
if ny>=0 and nx>=0 and ny<n and nx<m:
if board[ny][nx]==board[y][x] and visited[ny][nx]==False:
visited[ny][nx]=True
dfs(ny, nx, sy, sx, cnt+1)
visited[ny][nx]=False
if cnt>=4 and sy==ny and sx==nx:
answer='Yes'
return True
if answer=='Yes':
return
return False
n, m=map(int, input().split())
board=[]
for _ in range(n):
board.append(list(map(str, input())))
visited=[[False]*m for _ in range(n)]
answer='No'
for i in range(n):
for j in range(m):
visited[i][j]=True
dfs(i, j, i, j, 1)
if answer=='Yes':
break
print(answer)