반응형
문제링크:www.acmicpc.net/problem/16197
문제 조건에 따르며 구현했습니다.
두 동전의 좌표는 각각 c1y(coin 1 y좌표), c2x( coin 2 x 좌표)와 같은 형태로 나타냈습니다.
신경써야할 조건은 아래와 같습니다.
- 동전이 이동하려는 칸이 벽이면, 동전은 이동하지 않는다.
- 동전이 이동하려는 방향에 칸이 없으면 동전은 보드 바깥으로 떨어진다.
- 그 외의 경우에는 이동하려는 방향으로 한 칸 이동한다.이동하려는 칸에 동전이 있는 경우에도 한 칸 이동한다.
- 두 동전을 떨어뜨릴 수 없거나, 버튼을 10번보다 많이 눌러야 한다면, -1
조건에 맞추어 구현해주면 되는 dfs 겸 시뮬레이션 문제였습니다.
아래는 정답코드입니다.
1. 코인 두개 모두 범위안에 존재
2. 코인 둘 다 범위밖에 존재
3. 두개의 코인 중 하나만 밖으로 나감(결과 도출)
#include <iostream>
#include <string>
using namespace std;
int n, m;
int result = 2e9;
string arr[21]; //0base
int y_ar[4] = { 0,0,1,-1 };
int x_ar[4] = { 1,-1,0,0 };
void dfs(int cnt, int c1y, int c1x, int c2y, int c2x) {
if (cnt == 10)
return;
for (int i = 0; i < 4; i++) {
int n1y = c1y + y_ar[i];
int n1x = c1x + x_ar[i];
int n2y = c2y + y_ar[i];
int n2x = c2x + x_ar[i];
if (n1y >= 0 && n1y < n && n2y >= 0 && n2y < n && n1x >= 0 && n1x < m && n2x >= 0 && n2x < m) {
if (arr[n1y][n1x] == '#' && arr[n2y][n2x] == '#')
continue;
if (arr[n1y][n1x] == '#')
n1y = c1y, n1x = c1x;
if (arr[n2y][n2x] == '#')
n2y = c1y, n2x = c1x;
dfs(cnt + 1, n1y, n1x, n2y, n2x);
}
else if ((n1y < 0 || n1y >= n || n1x < 0 || n1x >= m) && (n2y < 0 || n2y >= n || n2x < 0 || n2x >= m)) {
continue;
}
else {
if (result > cnt + 1)
result = cnt + 1;
return;
}
}
}
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> n >> m;
int c1y, c1x, c2y, c2x;
bool chk = false;
for (int i = 0; i < n; i++) {
cin >> arr[i];
for (int j = 0; j < m; j++)
if (arr[i][j] == 'o'&& chk == false) {
c1y = i, c1x = j;
chk = true;
}
else if (arr[i][j] == 'o'&& chk == true) {
c2y = i, c2x = j;
}
}
dfs(0, c1y, c1x, c2y, c2x);
if (result == 2e9)
cout << -1 << endl;
else
cout << result << endl;
return 0;
}
반응형
'알고리즘 > DFS' 카테고리의 다른 글
[백준] 1967-트리의 지름(C++) (0) | 2021.01.31 |
---|---|
[백준] 3980-선발 명단(C++) (0) | 2021.01.24 |
[백준] 2239-스도쿠(C++) (0) | 2021.01.23 |
[백준] 1799-비숍(C++) (0) | 2021.01.19 |
[백준] 15918-랭퍼든 수열쟁이야!!!(C++) (0) | 2021.01.19 |