Study hard

(c++)백준 1987번: 알파벳 본문

백준/브루트 포스

(c++)백준 1987번: 알파벳

Nimgnoej 2020. 8. 28. 11:56

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

 

1987번: 알파벳

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

www.acmicpc.net

[풀이]

같은 알파벳이 적힌 칸을 두 번 지날 수 없다는 조건이 있으므로 새로운 알파벳을 지날 때마다 체크를 해주었다.

한 칸씩 움직일 때마다 최대 칸 수를 갱신한다.

 

#include <iostream>
#include <string>
using namespace std;

int R, C;
char Board[20][20];
bool check[25];//ascii코드로 변환해서 체크
const int dx[] = { -1,1,0,0 };//상,하
const int dy[] = { 0,0,-1,1 };//좌,우
int Max = 1;

void getStep(int cnt, int x, int y) {
	if (cnt > Max)Max = cnt;

	for (int i = 0; i < 4; i++) {
		int nx = x + dx[i];
		int ny = y + dy[i];
		if (nx < 0 || nx >= R || ny < 0 || ny >= C)
			continue;
		if (check[Board[nx][ny] - 'A'] == true)
			continue;
		check[Board[nx][ny] - 'A'] = true;
		getStep(cnt + 1, nx, ny);
		check[Board[nx][ny] - 'A'] = false;
	}
}

int main() {
	cin >> R >> C;
	string line;
	for (int i = 0; i < R; i++) {
		cin >> line;
		for (int j = 0; j < C; j++) {
			Board[i][j] = line[j];
		}
	}
	check[Board[0][0] - 'A'] = true;
	getStep(1, 0, 0);
	cout << Max << '\n';
	return 0;
}