문제: https://www.acmicpc.net/problem/16929
1)문제분류
-DFS
2)문제해결
- 기본 DFS 문제
- 각 시작지점을 정해놓고 4방향탐색하며 재귀탄다.
- 한 지점에는 한번씩만 가야하니까 방문체크하며 이동을 하는데
- 방문체크 되어있고, 재귀 출발한 시작지점이면 사이클을 돈 것 이므로 YES! 출력
- 재귀가 끝날 때까지 못만난다면 No! 출력
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
char map[52][52];
int n, m,sx,sy;
int chk[52][52];
int xrr[4] = { 0,0,1,-1 };
int yrr[4] = { 1,-1,0,0 };
int ok = 0;
bool range(int rx, int ry)
{
if (rx<0 || ry<0 || rx>n - 1 || ry>m - 1)
return false;
else
return true;
}
void dfs(int x, int y, int cnt, int color)
{
if (ok)return;
for (int i = 0; i < 4; i++)
{
int cx = x + xrr[i];
int cy = y + yrr[i];
if (range(cx, cy))
{
if (chk[cx][cy] == false)//방문되어있지않았다면
{
if (map[cx][cy] == color) //같은색이면 탐색
{
chk[cx][cy] = true;
dfs(cx, cy, cnt + 1, color); //개수 늘리고
}
}
else
{
if (cnt >= 4 && sx == cx && sy == cy)
{
ok = 1;
return;
}
}
}
}
}
int main()
{
cin >> n >> m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> map[i][j];
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
memset(chk, false, sizeof(chk));
sx = i;
sy = j;
chk[sx][sy] = true;
dfs(i, j, 1, map[i][j]);
if (ok)
{
cout << "Yes" << endl;
return 0;
}
}
}
cout << "No" << endl;
return 0;
}
'알고리즘문제풀이' 카테고리의 다른 글
[백준 1389]케빈 베이컨의 6단계 법칙 (0) | 2019.02.19 |
---|---|
[백준 16930]달리기 (0) | 2019.02.14 |
[백준 16928]뱀과 사다리 게임 (0) | 2019.02.14 |
[백준 2966] 찍기 (0) | 2019.02.14 |
[백준 14500]테트로미노 (0) | 2019.02.13 |