๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] 1987 ์•ŒํŒŒ๋ฒณ DFS

by Jouureee 2021. 2. 5.

๋ฌธ์ œ :

www.acmicpc.net/problem/1987

 

1987๋ฒˆ: ์•ŒํŒŒ๋ฒณ

์„ธ๋กœ R์นธ, ๊ฐ€๋กœ C์นธ์œผ๋กœ ๋œ ํ‘œ ๋ชจ์–‘์˜ ๋ณด๋“œ๊ฐ€ ์žˆ๋‹ค. ๋ณด๋“œ์˜ ๊ฐ ์นธ์—๋Š” ๋Œ€๋ฌธ์ž ์•ŒํŒŒ๋ฒณ์ด ํ•˜๋‚˜์”ฉ ์ ํ˜€ ์žˆ๊ณ , ์ขŒ์ธก ์ƒ๋‹จ ์นธ (1ํ–‰ 1์—ด) ์—๋Š” ๋ง์ด ๋†“์—ฌ ์žˆ๋‹ค. ๋ง์€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋„ค ์นธ ์ค‘์˜ ํ•œ ์นธ์œผ

www.acmicpc.net

๋ถ„์„ :

์œ„ ๋ฌธ์ œ๋Š” ์ „ํ˜•์ ์ธ DFS ๋ฌธ์ œ์ด๋‹ค. 

์ฒ˜์Œ์—๋Š” ์˜ค๋ฅธ์ชฝ๊ณผ ์•„๋ž˜์ชฝ์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๊ฒƒ๋งŒ ๊ณ ๋ คํ–ˆ๊ณ  ์ˆ˜ํ–‰ํ•œ ์•ŒํŒŒ๋ฒณ์€ set ํ•จ์ˆ˜์— ์ €์žฅํ•ด ๋†“์•„์•ผ์ง€ ์ƒ๊ฐํ•˜์—ฌ ์ ‘๊ทผํ–ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์•ˆ์ข‹์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด์—ˆ๋‹ค ํ•˜ํ•˜

 

๋งŒ์•ฝ ์ง„ํ–‰ ์ค‘ ๋™์ผํ•œ ์•ŒํŒŒ๋ฒณ์„ ๋งŒ๋‚œ๋‹ค๋ฉด ์ง„ํ–‰ํ•œ ๊ฒƒ์„ ์ง„ํ–‰ํ•˜์ง€ ์•Š์€ ๊ฒƒ์ฒ˜๋Ÿผ ํ•˜์—ฌ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ํƒ์ƒ‰ํ•˜๋Š” ๊ฒƒ์ด ํฌ์ธํŠธ์˜€๋‹ค. ์žฌ๊ท€ํ•จ์ˆ˜ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ถ”์ƒ์ ์ด๋ผ ์ž˜ ์ดํ•ด๊ฐ€์ง€ ์•Š์•„ ๋‹ค๋ฅธ ๋ฌธ์ œ๋“ค๋„ ๋งŽ์ด ํ’€์–ด๋ด์•ผ๊ฒ ๋‹ค. DFS, BFS๋Š” ๋ชจ๋‘ ์žฌ๊ท€๋กœ๋ฐ–์— ํ’€ ์ˆ˜ ์—†๋Š”๊ฑด์ง€๋„ ๊ถ๊ธˆํ•ด์กŒ๋‹ค. ๋” ๊ณต๋ถ€ํ•ด๋ด์•ผ์ง€ 

 

++ 21.04.21 ๋ณต์Šต

๋ฌธ์ œ์— ๋ช…์‹œ๋œ "์ƒˆ๋กœ ์ด๋™ํ•œ ์นธ์— ์ ํ˜€ ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ์€ ์ง€๊ธˆ๊นŒ์ง€ ์ง€๋‚˜์˜จ ๋ชจ๋“  ์นธ์— ์ ํ˜€ ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ๊ณผ๋Š” ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค." ์ด ๊ตฌ๋ฌธ์„ ํ†ตํ•ด ์•„ visit ๋ฅผ ์„ค์ •ํ•ด ๊ฐ™์€ ๊ณณ ๋ฐฉ๋ฌธํ•˜๋ฉด ์•ˆ๋˜๋Š” ๊ตฐ! ํ•˜๊ณ  ํŒŒ์•… ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

c++ ์ฝ”๋“œ :

//
//  1987_DFS.cpp
//  SOMA๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป
//
//  Created by JoSoJeong on 2021/02/04.
//

#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;

bool visit[26];
char arr[20][20];
int C, R;

int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};

int answer;

void DFS(int x, int y, int cnt){
    answer = max(answer, cnt);
    for(int i =0; i < 4; i++){
        int nx = x + dx[i];
        int ny = y + dy[i];
        if(nx >= 0 && ny >= 0 && nx < R && ny < C){
            if(visit[arr[nx][ny] - 'A'] == false){
                visit[arr[nx][ny] - 'A'] = true;
                DFS(nx, ny, cnt + 1); // ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฏ€๋กœ cnt + 1
                visit[arr[nx][ny] - 'A'] = false; //์žฌ๊ท€์ ์œผ๋กœ ๋‹ค ๋Œ๊ณ  ์™”์„ ๋•Œ ๋‹ค์‹œ ์‹œ์ž‘ ๋…ธ๋“œ์˜ ์ธ์ ‘ ๋…ธ๋“œ ๋ฐฉ๋ฌธ ์œ„ํ•ด์„œ
            }
        }
    }
}

int main(){
    
    cin >> R >> C;
    for(int i = 0; i < R; i++){
        for(int j = 0; j < C; j++){
            cin >> arr[i][j];
        }
    }
    
    visit[arr[0][0] - 'A'] = true;
    DFS(0,0,1);
    cout << answer << endl;
    return 0;
}

    
//    char horse = arr[0][0];
//    char next;
//    set<char> nt;
//    nt.insert(horse);
//    int i = 0;
//    int j =0;
//    int count = 1;
//    while(i < C && j < R){
//        next = arr[i][++j];
//        //cout << "next0 " << next <<endl;
//
//        if(horse == next){
//            if(*nt.find(next)){
//                break;
//            }
//            next = arr[++i][--j];
//            //cout << "next1 " << next <<endl;
//            if(horse == next){
//                //cout << "next2 " << next <<endl;
//                break;
//            }else{
//                if(*nt.find(next)){
//                    break;
//                }
//            }
//            nt.insert(next);
//
//        }else{
//            if(*nt.find(next)){
//                break;
//            }
//        }
//        count++;
//        horse = next;
//    }
//    cout<< count << endl;

 

 

 

๋Œ“๊ธ€