알고리즘/DFS
[백준] 16197-두 동전(C++)
잉읭응
2021. 1. 23. 18:07
반응형
문제링크:www.acmicpc.net/problem/16197
16197번: 두 동전
N×M 크기의 보드와 4개의 버튼으로 이루어진 게임이 있다. 보드는 1×1크기의 정사각형 칸으로 나누어져 있고, 각각의 칸은 비어있거나, 벽이다. 두 개의 빈 칸에는 동전이 하나씩 놓여져 있고,
www.acmicpc.net
문제 조건에 따르며 구현했습니다.
두 동전의 좌표는 각각 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;
}
반응형