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

+ Recent posts