본문 바로가기
CS/알고리즘

백준 13460 구슬탈출2

by zieunee 2020. 2. 15.
반응형

** 해결안된 부분 >> 

블루나 레드 구슬 탈출 후 바로 리턴해주었다 >>

첫번째에서 블루,레드부분이 탈출했을때 return 을 하게 되면 solve함수를 탈출해버려 나머지 for문이 돌지 못한다. 

continue로 바꿔주었더니 풀림 ... ㅎ 

 

나는 continue를 써야하는데 이상하게 for문을 추가해줘서 ... 이상하게 풀었다 

continue  , return 에 차이를 알고 잘쓰자!

 

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int dy[4] = { 1, 0, -1, 0 };
int dx[4] = { 0, 1, 0, -1 };
int N, M;
char map[12][12];
int ans = 11;
int rx, ry, bx, by,ox,oy;
int visited[12][12][12][12];

pair<int, int> go(int x, int y,int dir) {
	int nx = x; int ny = y;
	while (true) {
		 nx = dx[dir] + nx;
		 ny = dy[dir] + ny;

		if (map[nx][ny] == '#') {
			return{ nx- dx[dir],ny- dy[dir] };
		}
		else if (map[nx][ny] == 'O') {
			return{ nx,ny };
		}
	}

	return { nx,ny };
}

void solve(int rex, int rey, int bex, int bey,int depth) {
	if (depth == 10) {
		return;
	}
	for (int i = 0; i < 4; i++) {
		pair<int, int> blue = go(bex, bey, i);
		pair<int, int> red = go(rex, rey, i);
		if (red.first == ox && red.second == oy) {
			if (blue.first == ox && blue.second == oy) {
				continue;
			}
			else {
				ans = (ans > depth + 1 ? depth + 1 : ans);
		
			}
			return;
		}
		else if (blue.first == ox && blue.second == oy) continue;
	

		if (red.first == blue.first && red.second == blue.second) {
			switch (i) {
			case 0:
				if (rey > bey)  blue.second = blue.second - 1;
				else  red.second = red.second - 1;
				break;

			case 1:
				if (rex < bex) red.first = red.first - 1;
				else blue.first = blue.first - 1;
				break;

			case 2:
				if (rey > bey) red.second = red.second + 1;
				else blue.second = blue.second + 1;
				break;

			case 3:
				if (rex< bex) blue.first = blue.first + 1;
				else red.first = red.first + 1;
				break;
			}


		}
		if (visited[red.first][red.second][blue.first][blue.second] == 1 ) continue;
		visited[red.first][red.second][blue.first][blue.second] = 1;
		solve(red.first, red.second, blue.first, blue.second, depth + 1);
		visited[red.first][red.second][blue.first][blue.second] = 0;

	}
}

int main() {
	scanf("%d%d", &N, &M);
	for (int i = 0; i < N; i++) {
			scanf("%s", map[i]);
		for (int j = 0; j < M; j++) {
			if (map[i][j] == 'B') bx = i, by = j;
			else if (map[i][j] == 'R') rx = i, ry = j;
			else if (map[i][j] == 'O') ox = i, oy = j;
		}
	}
	visited[rx][ry][bx][by] = 1;
//	for (int i = 0; i < 4; i++) {
		solve(rx, ry, bx, by, 0);
//	}
	if (ans > 10) printf("%d", -1);
	else printf("%d", ans);


}
반응형

'CS > 알고리즘' 카테고리의 다른 글

백준 17837 새로운 게임2  (0) 2020.03.05
백준 17779 게리맨더링2  (0) 2020.03.04
백준 1986 체스  (0) 2020.02.11
백준 5397 키로거  (0) 2020.02.10
백준 3098 소셜네트워크  (0) 2020.02.10