1987 알파벳
본문 바로가기
알고리즘 모음집/New 알고리즘

1987 알파벳

by KyeongMin 2021. 2. 28.
728x90
반응형

www.acmicpc.net/problem/1987

 

1987번: 알파벳

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

www.acmicpc.net

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

#define NSIZE 21 // 배열 최대 가로 세로 사이즈
int R, C;//세로, 가로
int nMax = 0x80000000;// 최대값 변수
char board[NSIZE][NSIZE];//입력 배열
bool visit[NSIZE][NSIZE];//체크 배열 (탐색시 사용)
char alphabet[27];//알파벳 체크
int dy[] = { 0,1,0,-1 };//방향 검사
int dx[] = { 1,0,-1,0 };

void init() {//초기화 및 초기 입력
	R = C = 0;
	nMax = 0x80000000;
	memset(board, 0, sizeof(board));
	memset(visit, 0, sizeof(visit));
	scanf("%d %d", &R, &C);
	for (int r = 0; r < R; r++) {
		for (int c = 0; c < C; c++) {
			scanf(" %1c", &board[r][c]);
		}
	}
}
bool safeZone(int y, int x) {// 배열 범위 체크
	return 0 <= y && y < R && 0 <= x && x < C;
}
void dfs(int y, int x, int cnt) {//탐색 할 함수
	nMax = nMax < cnt ? cnt : nMax;

	for (int dir = 0; dir < 4; dir++) {
		int ny = y + dy[dir]; int nx = x + dx[dir];
		if (safeZone(ny,nx)&&alphabet[board[ny][nx] - 'A'] == 0&&visit[ny][nx]==0) {
			visit[ny][nx] = 1;
			alphabet[board[ny][nx] - 'A'] = 1;
			dfs(ny, nx, cnt + 1);
			alphabet[board[ny][nx] - 'A'] = 0;
			visit[ny][nx] = 0;
		}
	}
}
int main(void) {
	init();
	visit[0][0] = 1;
	alphabet[board[0][0] - 'A'] = 1;
	dfs(0, 0, 1);
	printf("%d\n", nMax);
	return 0;
}

기본적인 탐색에서 백트래킹의 기본 개념이므로 간단하게 풀 수 있습니다. 참고해주세요.

728x90
반응형

'알고리즘 모음집 > New 알고리즘' 카테고리의 다른 글

2143 두 배열의 합  (0) 2021.03.01
7453 합이 0인 네 정수  (0) 2021.02.28
9095 1,2,3 더하기  (0) 2021.02.25
1722 순열의 순서  (0) 2021.02.20
1018 체스판 다시 칠하기  (0) 2021.02.20

댓글