※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 21772번 문제인 가희의 고구마 먹방이다.
문제는 아래 링크를 확인하자.

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

 

21772번: 가희의 고구마 먹방

첫 번째 줄에 맵의 세로 크기 R, 가로 크기 C, 가희가 이동하는 시간 T가 주어집니다. 두 번째 줄부터 R+1번째 줄까지 길이가 C인 문자열이 주어집니다. 주어지는 문자열에 있는 문자는 가희를

www.acmicpc.net

상하좌우 움직임 네 가지를 중복을 포함해 10회 나열하는 경우의 수는 4의 10제곱인 1,048,576가지이다. 이 모든 경우의 수는 제한시간 내에 모두 조사하기에 충분히 적다.

 

위의 관찰을 이용해 모든 가능한 상하좌우 움직임을 시도해 문제를 해결하자.

 

가능한 움직임 중 "제자리에 있기"는 특별히 구현하지 않아도 됨을 확인하자. 초기 위치에서 움직일 수 있는 위치가 없는 경우를 제외한다면 항상 T회 움직이는 경우 중에 답이 적어도 하나 존재하기 때문이다.

 

아래는 제출한 소스코드이다.

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

int R, C, T;
int gR, gC;
string board[100];

int dr[4] = { 1,-1,0,0 };
int dc[4] = { 0,0,1,-1 };

int func(int r, int c, int moved) {
	if (moved == T) return 0;
	
	int ret = 0; 
	for (int i = 0; i < 4; i++) {
		int rr = r + dr[i], cc = c + dc[i];
		if (rr < 0 || rr >= R || cc < 0 || cc >= C || board[rr][cc] == '#') continue;
		if (board[rr][cc] == 'S') {
			board[rr][cc] = '.';
			ret = max(ret, func(rr, cc, moved + 1) + 1);
			board[rr][cc] = 'S';
		}
		else ret = max(ret, func(rr, cc, moved + 1));
	}

	return ret;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> R >> C >> T;
	for (int r = 0; r < R; r++) cin >> board[r];

	for (int r = 0; r < R; r++) {
		for (int c = 0; c < C; c++) {
			if (board[r][c] == 'G') board[r][c] = '.', gR = r, gC = c;
		}
	}

	cout << func(gR, gC, 0);
}

 

728x90

'BOJ' 카테고리의 다른 글

[BOJ 17265 // C++] 나의 인생에는 수학과 함께  (0) 2023.07.24
[BOJ 26740 // C++] Nawiasowania  (0) 2023.07.23
[BOJ 26640 // C++] Palindrom  (0) 2023.07.21
[BOJ 26660 // C++] A + B  (0) 2023.07.20
[BOJ 2275 // C++] 트리의 높이 줄이기  (0) 2023.07.19

+ Recent posts