본문 바로가기
algorithm/ACMICPC

주사위 윷놀이 - 17825

by 에어컨조아 2020. 1. 31.

문제 : https://www.acmicpc.net/problem/17825

 

17825번: 주사위 윷놀이

주사위 윷놀이는 다음과 같은 게임판에서 하는 게임이다. 가장 처음에는 시작에 말 4개가 있다. 말은 게임판에 적힌 화살표의 방향대로만 이동할 수 있다. 파란색 칸에서 말이 이동을 시작하는 경우에는 파란색 화살표의 방향으로 이동해야 하며 파란색 칸을 지나가는 경우에는 빨간 화살표의 방향대로 이동해야 한다. 게임은 1부터 5까지 한 면에 하나씩 적혀있는 5면 주사위를 굴려서 나온 수만큼 이동하는 방식으로 진행한다. 이동하려고 하는 칸에 말이 이미 있는 경우에

www.acmicpc.net

 

코드 : 

#include <iostream>
#include <vector>

using namespace std;

int result = 0;
int indexArr[33][2] = { 0 }; // 이동 인덱스 
int vArr[33] = { 0 }; // 값
bool check[4] = { false };
int pos[4] = { 0 }; // 말의 위치

void solution(int count, int* move, int max)
{
	if (count == 10)
	{
		if (max > result)
		{
			result = max;
		}
		return;
	}

	//말 갯수만큼 루프
	for (int c = 0; c < 4; c++)
	{
		int si = pos[c]; // 각 말별로 위치한 지점부터 시작

		//이미 도착한 말 체크
		if (check[c])
			continue;
		
		int addvalue = 0;
		//다른 길
		bool other = false;
		if (si == 5 || si == 10 || si == 15)
		{
			other = true;
		}
		int k = move[count];
		for (int i = 0; i < k; i++)
		{
			if (other)
			{
				other = false;
				si = indexArr[si][1];
			}
			else
			{
				si = indexArr[si][0];
			}
			if (si == 21)
				break;
		}
		//다른 말이 이미 위치해있는 경우 단 종료지점은 예외
		bool already = false;
		for (int j = 0; j < 4; j++)
		{
			if (si == pos[j] && si != 21)
			{
				already = true;
				continue;
			}
		}
		if (already) continue;

		int temp = pos[c];
		pos[c] = si;
		addvalue += vArr[si];

		if (si == 21)
		{
			check[c] = true;
		}
		solution(count + 1, move, max + addvalue);
		if (check[c])
		{
			check[c] = false;
		}
		pos[c] = temp; // 이동한것 원복
	}

}


int main()
{
	int move[10] = { 0 };

	for (int i = 0; i < 10; i++)
	{
		cin >> move[i];
	}

	// lookup Table
	for (int i = 0; i <= 20; i++)
	{
		indexArr[i][0] = i + 1;
	}

	indexArr[5][1] = 22;
	indexArr[10][1] = 26;
	indexArr[15][1] = 28;

	indexArr[22][0] = 23;
	indexArr[23][0] = 24;
	indexArr[24][0] = 25;

	indexArr[26][0] = 27;
	indexArr[27][0] = 25;

	indexArr[28][0] = 29;
	indexArr[29][0] = 30;
	indexArr[30][0] = 25;

	indexArr[25][0] = 31;
	indexArr[31][0] = 32;
	indexArr[32][0] = 20;

	// 값 저장
	for (int i = 1; i <= 20; i++)
	{
		vArr[i] = i * 2;
	}
	vArr[22] = 13;
	vArr[23] = 16;
	vArr[24] = 19;
	vArr[25] = 25;

	vArr[28] = 28;
	vArr[29] = 27;
	vArr[30] = 26;

	vArr[26] = 22;
	vArr[27] = 24;

	vArr[31] = 30;
	vArr[32] = 35;

	solution(0, move, 0);

	cout << result << "\n";
	return 0;
}

 어렵다.. 아직도 부족한게 너무 많다...

크게보면

1. 윷놀이 판을 배열에 맵핑하는 방법

2. DFS를 사용하여 모든 말에 대한 경우의 수 구하기

이렇게 2가지로 볼 수 있었다... 

'algorithm > ACMICPC' 카테고리의 다른 글

원판 돌리기 - 17822  (0) 2020.01.24
로봇 청소기 - 14503  (0) 2019.12.25
연구소 - 14502  (0) 2019.12.25
N-Queen - 9663  (0) 2019.12.23
테트로미노 - 14500 (Solve 2)  (0) 2019.12.14

댓글