https://www.acmicpc.net/problem/16197
16197번: 두 동전
N×M 크기의 보드와 4개의 버튼으로 이루어진 게임이 있다. 보드는 1×1크기의 정사각형 칸으로 나누어져 있고, 각각의 칸은 비어있거나, 벽이다. 두 개의 빈 칸에는 동전이 하나씩 놓여져 있고,
www.acmicpc.net
#include <iostream>
#include <algorithm>
#define MAX 20
using namespace std;
struct coin{
int x;
int y;
};
int ans = -1;
int N,M;
int dx[4] = {0,0,-1,1};
int dy[4] = {-1,1,0,0};
char map[MAX][MAX];
void dfs(coin a,coin b, int cnt)
{
if((a.x<0 || a.x>= M||a.y<0||a.y>=N) || (b.x<0||b.x>=M|| b.y<0||b.y>=N)){
if(ans==-1){ans = cnt;}
else{ ans = min(ans,cnt);}
}
if(cnt >= 10) return;
for(int i=0;i<4;i++){
int aTx = a.x+dx[i];
int aTy = a.y+dy[i];
int bTx = b.x+dx[i];
int bTy = b.y+dy[i];
if((aTx<0 || aTx>= M||aTy<0||aTy>=N) &&(bTx<0||bTx>=M|| bTy<0||bTy>=N)){
continue;
}else if(map[aTy][aTx] == '#'&&map[bTy][bTx]== '#'){
}else{
if(map[aTy][aTx] == '#'){
coin B= {bTx,bTy};
dfs(a,B,cnt+1);
}else if(map[bTy][bTx] == '#'){
coin A = {aTx,aTy};
dfs(A,b,cnt+1);
}else{
coin A = {aTx,aTy};
coin B = {bTx,bTy};
dfs(A,B,cnt+1);
}
}
}
}
int main(int argc, char *argv[])
{
cin >> N >> M;
coin a,b;
bool flag = false;
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
cin >> map[i][j];
if(map[i][j] == 'o' ){
if(!flag){
flag = true;
a.x = j; a.y = i;
}else{
b.x = j; b.y = i;
}
map[i][j] = '.';
}
}
}
dfs(a,b,0);
cout << ans;
}
'프로그래밍 > C++' 카테고리의 다른 글
2873 롤러코스터 [C++] (0) | 2023.08.26 |
---|---|
C++ 벡터, 문자열 삽입 및 삭제 연산 자료 (0) | 2023.07.30 |
11404 플로이드 [c++] (0) | 2023.06.25 |
2841 외계인의 기타연주 [C++] (0) | 2023.06.14 |
1181 단어 정렬 [c++] (0) | 2023.06.11 |