알고리즘/Baekjoon

13460번:구슬 탈출 2

따아앙이 2024. 11. 24. 23:49
https://www.acmicpc.net/problem/13460

 

메모리:1140KB

시간:0ms

코드길이:2620B

#include <stdio.h>

struct cBead { int xy[4], cnt = 0; };

bool visit[11][11][11][11];
char map[11][11];
char mapCopy[11][11];
cBead que[121 * 4];
int N, M, head, tail;
int arrBead[2];
int xyNew[4];
int r, c;
bool isFinish[2] = { 0, 0 };


bool process(int r, int c, int bead, int rOffSet, int cOffSet )
{
	if (map[r][c] == '#' || map[r][c] == 'T') {
		xyNew[arrBead[bead]] = r + rOffSet;
		xyNew[arrBead[bead] + 1] = c + cOffSet;
		map[r + rOffSet][c + cOffSet] = 'T';
		return true;
	}
	else if (map[r][c] == 'O') {
		isFinish[arrBead[bead] / 2] = true;
		return true;
	}

	return false;
}


int move(int dir)
{
	isFinish[0] = isFinish[1] = 0;

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			map[i][j] = mapCopy[i][j];
		}
	}

	if ((dir == 1 && que[head].xy[0] <= que[head].xy[2])
		|| (dir == 2 && que[head].xy[0] >= que[head].xy[2])
		|| (dir == 3 && que[head].xy[1] <= que[head].xy[3])
		|| (dir == 4 && que[head].xy[1] >= que[head].xy[3]))	
	{
		arrBead[0] = 0; arrBead[1] = 2;
	}
	else 
	{
		arrBead[0] = 2;	arrBead[1] = 0;
	}

	for (int bead = 0; bead < 2; bead++)
	{
		r = que[head].xy[arrBead[bead]];
		c = que[head].xy[arrBead[bead] + 1];
		
		if (dir == 1) { for (; r >= 0; r--) { if (process(r, c, bead, 1, 0)) { break; } } }
		else if (dir == 2) { for (; r < N; r++) { if (process(r, c, bead, -1, 0)) { break; } } }
		else if (dir == 3) { for (; c >= 0; c--) { if (process(r, c, bead, 0, 1)) { break; } } }
		else if (dir == 4) { for (; c < M; c++) { if (process(r, c, bead, 0, -1)) { break; } } }
	}

	if (isFinish[1]) { return 0; }
	else if (isFinish[0] && !isFinish[1]) 
	{
		if (que[head].cnt + 1 > 10) { return -1; }
		else { return que[head].cnt + 1; }
	}
	
	if (visit[xyNew[0]][xyNew[1]][xyNew[2]][xyNew[3]] == 1) { return 0; }
	visit[xyNew[0]][xyNew[1]][xyNew[2]][xyNew[3]] = 1;

	tail++;
	que[tail].cnt = que[head].cnt + 1;
	for (int i = 0; i < 4; i++) { que[tail].xy[i] = xyNew[i]; }

	return 0;
}

int main()
{
	head = 0, tail = 0;
	scanf("%d %d", &N, &M);
	for (int i = 0; i < N; i++) { scanf("%s", &mapCopy[i]); }

	for (int r = 0; r < N; r++) {
		for (int c = 0; c < M; c++) {
			if (mapCopy[r][c] == 'R') {
				mapCopy[r][c] = '.';
                que[0].xy[0] = r;
				que[0].xy[1] = c;
			}
			else if (mapCopy[r][c] == 'B') {
				mapCopy[r][c] = '.';
                que[0].xy[2] = r;
				que[0].xy[3] = c;
			}
		}
	}
	
	visit[que[head].xy[0]][que[head].xy[1]][que[head].xy[2]][que[head].xy[3]] = 1;
	int ret;
	while (head <= tail) {
		for (int i = 1; i <= 4; i++) {
			ret = move(i);
			if (ret != 0) {
				printf("%d", ret); 
				return 0;
			}
		}
		head++;
	}
	printf("-1");
	return 0;
}