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 |