zz12345의 코딩 공부

https://www.acmicpc.net/problem/1987

 

1987번: 알파벳

세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으

www.acmicpc.net

 

코드

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
#include <iostream>
using namespace std;
char arr[20][20];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
bool alpha[26];
int res,r,c;
void dfs(int x,int y,int num)
{
    num++;
    if(res<num)res=num;
    for(int i=0;i<4;i++)
    {
        if(x+dx[i]>=0 && x+dx[i]<&& y+dy[i]>=0 && y+dy[i]<c)
        {
            if(alpha[arr[x+dx[i]][y+dy[i]]-65]==false)
            {
                alpha[arr[x+dx[i]][y+dy[i]]-65]=true;
                dfs(x+dx[i],y+dy[i],num);
                alpha[arr[x+dx[i]][y+dy[i]]-65]=false;
            }
        }
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin>>r>>c;
    for(int i=0;i<r;i++)
    {
        for(int j=0;j<c;j++)
        {
            cin>>arr[i][j];
        }
    }
    alpha[arr[0][0]-65]=true;
    dfs(0,0,0);
    cout<<res;
    return 0;
}
cs

 

풀이

 dfs함수를 이용하여 상, 하, 좌, 우의 위치 중에서 (14행) 같은 알파벳이 적힌 칸을 두 번 지날 수 없다는 규칙을 어기지 않는 칸으로 진행한다. (16행) 이를 위해서 alpha 배열을 사용하는데 A-65 =0, Z-65=25이므로 alpha배열의 크기는 26이고 각 알파벳-65의 값이 그 알파벳을 이미 방문했는지 검사하는 인덱스가 된다. (A=0, B=1 ,,,, Z=25) 재귀적으로 진행되는 dfs함수에서 alpha 배열을 이용하기 위해서 18~20행이 코드를 수행한다.

'알고리즘 > 백준' 카테고리의 다른 글

백준 2632번 : 피자판매 (C++)  (0) 2021.06.29
백준 2003번 : 수들의 합 2 (C++)  (0) 2021.06.25
백준 5014번 : 스타트링크 (C++)  (0) 2021.06.21
백준 9019번 : DSLR (C++)  (0) 2021.06.17
백준 1744번 : 수 묶기 (C++)  (0) 2021.06.16

공유하기

facebook twitter kakaoTalk kakaostory naver band