Study/Baekjoon

[백준/C++] 17130 토끼가 정보섬에 올라온 이유

에린_1 2024. 3. 27. 16:06
728x90

17130 토끼가 정보섬에 올라온 이유

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

 

17130번: 토끼가 정보섬에 올라온 이유

첫 줄에 격자의 크기 N과 M이 주어진다. 그 다음 줄부터 격자의 상태가 N개의 줄에 걸쳐 주어진다. '.'은 빈 공간을, '#'은 벽을, 'R'은 토끼를, 'C'는 당근을, 'O'는 정보섬 쪽문을 나타낸다. 'R'은 반

www.acmicpc.net

#include<bits/stdc++.h>

using namespace std;

int n, m, startY ,ans = 0;
string s;
int dp[1001][1001] = { 0, };
char _map[1001][1001];
bool check = false;

void move()
{
	for (int j = startY; j < m; ++j)
	{
		for (int i = 0; i < n; ++i)
		{
			if ('#' == _map[i][j])
				continue;
			if (i - 1 >= 0 && j - 1 >= 0 && dp[i - 1][j - 1] != -1)
				dp[i][j] = max(dp[i][j], dp[i - 1][j - 1]);
			if (j - 1 >= 0 && dp[i][j - 1] != -1)
				dp[i][j] = max(dp[i][j], dp[i][j - 1]);
			if (i + 1 < n && j - 1 >= 0 && dp[i + 1][j - 1] != -1)
				dp[i][j] = max(dp[i][j], dp[i + 1][j - 1]);
			
			if ('C' == _map[i][j] && dp[i][j] != -1)
				++dp[i][j];
			if ('O' == _map[i][j] && dp[i][j] != -1)
			{
				check = true;
				ans = max(ans, dp[i][j]);
			}

		}
	}
}

int main()
{
	memset(dp, -1, sizeof(dp));
	cin >> n >> m;
	for (int i = 0; i < n; ++i)
	{
		cin >> s;
		for (int j = 0; j < s.size(); ++j)
		{
			_map[i][j] = s[j];
			if ('R' == _map[i][j])
			{
				startY = j;
				dp[i][j] = 0;
			}
		}
	}
	move();
	if (check)
		cout << ans << "\\n";
	else
		cout << "-1" << "\\n";

	return 0;
}
  • 토끼는 →, ↘, ↗ 방향으로만 이동 가능하다.
  • 방금 토끼 한 마리가 정보섬 정문으로 들어왔다. → 이말의 뜻이 x는 0에서 시작한다는 것을 의미한다.
  • dp를 사용해서 풀어야하는 문제, bfs를 통해서도 풀 수는 있을듯 하다
728x90

'Study > Baekjoon' 카테고리의 다른 글

[백준/C++] 14502 연구소  (0) 2024.04.01
[백준/C++] 1005 ACM Craft  (0) 2024.03.28
[백준/C++] 1504 특정한 최단 경로  (0) 2024.03.26
[백준/C++] 15886 내 선물을 받아줘 2  (0) 2024.03.04
[백준/C++] 10451 순열 사이클  (0) 2024.03.03