반응형
https://www.acmicpc.net/problem/1987
1987번: 알파벳
문제 세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다. 좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는
www.acmicpc.net
#include <iostream>
#include <algorithm>
#include <string.h>
#include <vector>
#include<queue>
using namespace std;
char map[22][22];
int R, C;
int arr['Z'-'A'+1];
int dy[] = { 1,0,-1,0 };
int dx[] = { 0,1,0,-1 };
int dfs(int val,int x, int y) {
int res = 1;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx < 1 || ny < 1 || nx > R || ny > C || arr[map[nx][ny] - 'A']) continue;
arr[map[nx][ny] - 'A'] =1;
res = max(res, dfs(map[nx][ny], nx, ny)+1);
arr[map[nx][ny] - 'A'] =0;
}
return res;
}
int main() {
scanf("%d%d", &R, &C);
for (int i = 1; i <= R; i++) {
for (int j = 1; j <= C; j++) {
scanf(" %c", &map[i][j]);
}
}
arr[map[1][1] - 'A'] = 1;
printf("%d", dfs(map[1][1], 1, 1));
}
** 핵심
알파벳 아스키코드 대신 쉽게 선언하는 방법
int arr['Z'-'A'+1];
//Z에서 A를 빼서 +1 더한값만큼 선언 (A~Z까지)
arr[map[nx][ny] - 'A']
//값이 C라면 -A하면 3이 남음
반응형
'CS > 알고리즘' 카테고리의 다른 글
백준 9019 DSLR(bfs) (0) | 2019.10.27 |
---|---|
백준 3055 탈출 (0) | 2019.10.27 |
백준 2206 벽 부수고 이동하기 (0) | 2019.10.27 |
백준 1600 말이 되고픈 원숭이 (bfs , 사선) (0) | 2019.10.27 |
백준 1260 bfs 와 dfs (0) | 2019.10.27 |