티스토리 뷰
반응형
✏️ 문제 링크
https://www.acmicpc.net/problem/16929
✏️ 문제 설명
✏️ 문제 풀이
주어진 배열 안에서 사이클의 유무를 찾는 문제이며, dfs로 접근할 수 있습니다. bfs로도 똑같은 방식으로 문제를 풀어봤는데 자꾸 예제 2번에서 틀리다고 나와서 포기했습니다... 가로와 세로의 길이가 50보다 작거나 같기 때문에 모든 점에 대해서 dfs로 탐색을 해도 시간초과가 발생하지 않습니다. dfs함수에서 조건을 조금만 생각하면 쉽게 풀 수 있습니다
- 다음으로 가고자 하는 mx와 my의 값이 배열의 범위를 벗어나지는 않는가?
- 다음으로 가고자 하는 map[mx][my]가 이전에 방문했던 알파벳 값과 동일한가?
- 다음으로 가고자 하는 visit[mx][my]가 이전에 이미 방문한 적이 없는가? => 방문 후 탐색하기
- 이미 방문했던 곳이지만 그곳이 출발점이면서 방문한 점의 개수가 4보다 크거나 같은가?
✏️ 문제 코드
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int, int>edge;
char map[51][51];
bool visit[51][51];
int dx[4] = { 0,1,0,-1 };
int dy[4] = { 1,0,-1,0 };
int N, M;
bool check = false;
int start_X = 0;
int start_Y = 0;
void dfs(int i, int j,int cnt);
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
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++) {
start_X = i;
start_Y = j;
dfs(i, j,1);
if (check) {
cout << "Yes";
return 0;
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
visit[i][j]=false;
}
}
}
}
cout << "No";
}
void dfs(int i, int j,int cnt) {
if (check)
return;
visit[i][j] = true;
for (int x = 0; x < 4; x++) {
int mx = dx[x] + i;
int my = dy[x] + j;
if (mx < 0 || my < 0 || mx >= N || my >= M)
continue;
if (map[mx][my] != map[i][j])
continue;
if (visit[mx][my] == false) {
visit[mx][my] = true;
dfs(mx, my, cnt + 1);
}
else {
if (cnt >= 4 && mx == start_X && my == start_Y) {
check = true;
return;
}
}
}
}
반응형
'Algorithm > BOJ' 카테고리의 다른 글
[C/C++] 백준 2573번 - 빙산 (2) | 2025.01.03 |
---|---|
[C/C++] 백준 2579번 - 계단 오르기 (0) | 2024.05.12 |
[C/C++] 백준 2589번 - 보물섬 (0) | 2024.05.04 |
[C/C++] 백준 31778번 - PPC 만들기 (0) | 2024.05.03 |
[C/C++] 백준 알고리즘 수업 - 피보나치 문제 모음 (0) | 2024.05.01 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Do it!
- 유니온 파인드
- 알고리즘
- 반복문
- 투 포인터
- C++ Stack
- 이분 매칭
- BFS
- 유클리드 호제법
- CSS
- html
- 스택
- java
- c++ string
- DP
- 자바
- 자료구조
- 백준
- 스프링 부트 crud 게시판 구현
- 에라토스테네스의 체
- 카운팅 정렬
- 자바스크립트
- C++
- js
- 우선순위 큐
- 알고리즘 공부
- DFS
- 백준 풀이
- 세그먼트 트리
- HTML5
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함