알고리즘/백준(BOJ)
백준 - 16929 Two Dots
시나모온
2020. 8. 9. 02:10
문제 링크입니다 : https://www.acmicpc.net/problem/16929
16929번: Two Dots
첫째 줄에 게임판의 크기 N, M이 주어진다. 둘째 줄부터 N개의 줄에 게임판의 상태가 주어진다. 게임판은 모두 점으로 가득차 있고, 게임판의 상태는 점의 색을 의미한다. 점의 색은 알파벳 대문��
www.acmicpc.net
사이클 찾는 유형이다.
사이클을 찾는 알고리즘은 DFS로 구현하는 것이 일반적이며
vector<vector<int>> adj;
vector<int> visiting;
vector<int> visited;
int findCircle(int here) {
if (visiting[here]) return true;
if (visited[here]) return false;
visited[here] = true;
visiting[here] = true;
for (int i = 0; i < adj[here].size(); i++) {
if (findCircle(adj[here][i])) return true;
}
visiting[here] = false;
return false;
}
이런 코드를 미리 알고 있으면 매우 쉽게 해결할 수 있다.
#include <iostream>
#include <vector>
using namespace std;
const int dy[4] = {0, 0, -1, 1};
const int dx[4] = {-1, 1, 0, 0};
int N, M;
vector<vector<char>> board;
vector<vector<bool>> visited;
vector<vector<bool>> visiting;
bool findCircle(char color,int py, int px, int y, int x) {
if(visiting[y][x]) return true;
if(visited[y][x]) return false;
visited[y][x] = true;
visiting[y][x] = true;
for(int dir = 0; dir < 4; dir++) {
int ny = y + dy[dir];
int nx = x + dx[dir];
if(ny < 0 || ny >= N || nx < 0 || nx >= M) continue;
if(py == ny && px == nx) continue;
if(board[ny][nx] != color) continue;
if(findCircle(color, y, x, ny, nx)) return true;
}
visiting[y][x] = false;
return false;
}
int main() {
cin >> N >> M;
board.assign(N, vector<char>(M));
visited.assign(N, vector<bool>(M, false));
visiting.assign(N, vector<bool>(M, false));
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
cin >> board[i][j];
}
}
bool flag = false;
for(int i = 0; i < N; i++) {
for(int j = 0; j < M; j++) {
if(findCircle(board[i][j], -1, -1, i, j)) {
flag = true;
break;
}
// }
}
if(flag) break;
}
if(flag) {
cout << "Yes";
} else {
cout << "No";
}
return 0;
}
개발 환경 : vscode
지적, 조언, 질문 환영입니다! 댓글 남겨주세요~