λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ”₯ PS(Problem Solving) πŸ”₯/BOJ

[BOJ] #16929 Two Dots

by dar0m! 2019. 9. 29.
μ‹œκ°„ μ œν•œ λ©”λͺ¨λ¦¬ μ œν•œ μ •λ‹΅ λΉ„μœ¨
2 초 512 MB 50.417%

 

 

16929번: Two Dots

첫째 쀄에 κ²Œμž„νŒμ˜ 크기 N, M이 주어진닀. λ‘˜μ§Έ 쀄뢀터 N개의 쀄에 κ²Œμž„νŒμ˜ μƒνƒœκ°€ 주어진닀. κ²Œμž„νŒμ€ λͺ¨λ‘ 점으둜 가득차 있고, κ²Œμž„νŒμ˜ μƒνƒœλŠ” 점의 색을 μ˜λ―Έν•œλ‹€. 점의 색은 μ•ŒνŒŒλ²³ λŒ€λ¬Έμž ν•œ κΈ€μžμ΄λ‹€.

www.acmicpc.net

 

싀버 3 μ΄λΌμ„œ 쑰금 겁을 λ¨Ήμ—ˆλŠ”λ° μˆ μˆ ν’€λ €μ„œ λ†€λžλ˜ λ¬Έμ œλ‹€. 
κΈ°μ‘΄ κ·Έλž˜ν”„μ˜ 사이클 λ¬Έμ œμ™€λŠ” λ‹€λ₯΄κ²Œ 변을 κ³΅μœ ν•΄μ•Όν•˜λŠ” 쑰건이 μΆ”κ°€λ˜μ–΄ 생각을 ν•΄λ³΄λ‹ˆ, 이전에 μ™”λ˜ λ°©ν–₯으둜 λ‹€μ‹œ 탐색을 λͺ»ν•˜κ²Œλ” κ΅¬ν˜„μ„ ν•˜λ©΄ λ˜κ² λ‹€ μ‹Άμ–΄ κ΅¬ν˜„ν•΄λ³΄λ‹ˆ μ˜μ™Έλ‘œ λ§€κ°œλ³€μˆ˜ ν•˜λ‚˜λ§Œ μΆ”κ°€ν•˜κ³  λ°˜λ³΅λ¬Έμ— 쑰건 ν•˜λ‚˜λ§Œ λ„£μœΌλ©΄ λ˜μ–΄ μ‰½κ²Œ ν’€ 수 μžˆμ—ˆλ‹€.

그리고 항상 nr, nc λ³€μˆ˜λ₯Ό μ§€μ—­λ³€μˆ˜λ‘œ μ„ μ–Έν•˜λ‹€κ°€ μ „μ—­λ³€μˆ˜λ‘œ 선언해보면 μ–΄λ–¨κΉŒ μ‹Άμ–΄μ„œ μ „μ—­λ³€μˆ˜λ‘œ ν–ˆλ‹€κ°€ chkλ°°μ—΄ 체크λ₯Ό ν‘ΈλŠ” 과정이 μƒκ°λŒ€λ‘œ 잘 λ˜μ§€ μ•ŠλŠ” λ¬Έμ œκ°€ μƒκ²¨μ„œ λ‹€μ‹œ μ§€μ—­λ³€μˆ˜λ‘œ λ°”κΏ¨λ”λ‹ˆ 잘 ν•΄κ²°λ˜μ—ˆλ‹€.

이 문제의 ν•΅μ‹¬μ΄μ—ˆλ˜ DFSλŠ” μ œλŒ€λ‘œ 잘 κ΅¬ν˜„μ΄ λ˜μ—ˆμ§€λ§Œ 체크λ₯Ό ν‘ΈλŠ” κ³Όμ •μ—μ„œ μ‹œν–‰μ°©μ˜€κ°€ μžˆμ–΄ 생각보닀 μ‰¬μ› μ§€λ§Œ 였래걸렸던 λ¬Έμ œμ΄λ‹€.

testcase 

3 4
AAAA
ABCA
AADA

좜λ ₯: No

 

λ©”λͺ¨λ¦¬ μ‹œκ°„
1132 KB 0 ms
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
32
33
34
35
36
37
38
39
40
41
42
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
int dx[] = { 0,1,0,-1 };
int dy[] = { 1,0,-1,0 };
char arr[55][55];
int chk[55][55];
int n, m;
void dfs(int r, int c, int cnt, int dontgodir) {
    if (cnt >= 4 && chk[r][c]) {
        printf("Yes"); 
        exit(0);
    }
    chk[r][c] = 1;
    char C = arr[r][c];
    for (int i = 0; i < 4; i++) {
        if (dontgodir == i) continue;
        int nr = r + dx[i], nc = c + dy[i];
        if (arr[nr][nc] == C && nr >= 0 && nr < n && nc >= 0 && nc < m) {
            dfs(nr, nc, cnt + 1, (i + 2) % 4);
            chk[nr][nc] = 0;
        }
    }
    return;
}
int main(){    
    scanf("%d%d"&n, &m);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf(" %c"&arr[i][j]);
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            dfs(i, j, 0-1);
            chk[i][j] = 0;
        }
    }
    printf("No");
    return 0;
}
cs

 

'πŸ”₯ PS(Problem Solving) πŸ”₯ > BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ] #14889 μŠ€νƒ€νŠΈμ™€ 링크  (0) 2019.10.02
[BOJ] #3190 λ±€  (0) 2019.09.29
[BOJ] #6359 λ§Œμ·¨ν•œ 상범  (0) 2019.09.19
[BOJ] #14501 퇴사  (0) 2019.09.19
[BOJ] #2309 일곱 λ‚œμŸμ΄  (0) 2019.09.19

λŒ“κΈ€