본문 바로가기
백준 알고리즘/구현

주사위 윷놀이 C++

by paysmile 2021. 10. 16.

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

 

17825번: 주사위 윷놀이

첫째 줄에 주사위에서 나올 수 10개가 순서대로 주어진다.

www.acmicpc.net

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int dice[10];
vector<pair<int, int>> hr; //루트 번호, 인덱스
int r1[6] = { 0,2,4,6,8,10 };
int r2[4] = { 13,16,19,25 };
int r3[5] = { 12,14,16,18,20 };
int r4[5] = { 22,24,26,28,30 };
int r5[2] = { 22,24 };
int r6[3] = { 28,27,26 };
int r7[4] = { 32,34,36,38 };
int r8[4] = { 30,35,40,0 };
int answer = 0;

void MoveHorse(int index, vector<pair<int, int>> h,int count) {
	if (index == 10) {
		answer = max(answer, count);
		return;
	}

	for (int i = 0; i < 4; i++) {
		if (h[i] == make_pair(-1, -1))	continue;
		pair<int, int> tmp_h = h[i];
		int tmp = h[i].second;
		int tmp_count = count;

		tmp += dice[index];
		if (h[i].first == 1) {
			if (tmp > 5) {
				h[i] = make_pair(3, tmp - 6);
				tmp_count += r3[tmp-6];
			}
			else if (tmp == 5) {
				h[i] = make_pair(2, -1);
				tmp_count += 10;
			}
			else {
				h[i] = make_pair(1, tmp);
				tmp_count += r1[tmp];
			}
		}
		else if (h[i].first == 2) {
			if (tmp > 3) {
				h[i] = make_pair(8, tmp - 4);
				if (tmp - 4 >= 3) {
					h[i] = make_pair(-1, -1);
				}
				else
				{
					tmp_count += r8[tmp-4];
				}
			}
			else {
				h[i] = make_pair(2, tmp);
				tmp_count += r2[tmp];
			}
		}
		else if (h[i].first == 3) {
			if (tmp < 4) {
				h[i] = make_pair(3, tmp);
				tmp_count += r3[tmp];
			}
			else if (tmp == 4) {
				h[i] = make_pair(5, -1);
				tmp_count += 20;
			}
			else if (tmp > 4) {
				h[i] = make_pair(4, tmp - 5);
				tmp_count += r4[tmp-5];
			}
		}
		else if (h[i].first == 4) {
			if (tmp < 4) {
				h[i] = make_pair(4, tmp);
				tmp_count += r4[tmp];
			}
			else if (tmp == 4) {
				h[i] = make_pair(6, -1);
				tmp_count += 30;
			}
			else if (tmp > 4 && tmp <=8) {
				h[i] = make_pair(7, tmp - 5);
				tmp_count += r7[tmp-5];
			}
			else if (tmp > 8) {
				h[i] = make_pair(8, tmp - 7);
				if (tmp - 7 >= 3) {
					h[i] = make_pair(-1, -1);
				}
				else {
					tmp_count += r8[tmp - 7];
				}
			}
		}
		else if (h[i].first == 5) {
			if (tmp <= 1) {
				h[i] = make_pair(5, tmp);
				tmp_count += r5[tmp];
			}
			else if (tmp == 2) {
				h[i] = make_pair(2, 3);
				tmp_count += r2[3];
			}
			else if (tmp > 2) {
				h[i] = make_pair(8, tmp - 3);
				if (tmp - 3 >= 3) {
					h[i] = make_pair(-1, -1);
				}
				else
					tmp_count += r8[tmp-3];
			}
		}
		else if (h[i].first == 6) {
			if (tmp <= 2) {
				h[i] = make_pair(6, tmp);
				tmp_count += r6[tmp];
			}
			else if (tmp == 3) {
				h[i] = make_pair(2, 3);
				tmp_count += r2[3];
			}
			else if (tmp > 3) {
				h[i] = make_pair(8, tmp - 4);
				if (tmp - 4 >= 3) {
					h[i] = make_pair(-1, -1);
				}
				else
					tmp_count += r8[tmp-4];
			}
		}
		else if (h[i].first == 7) {
			if (tmp <= 3) {
				h[i] = make_pair(7, tmp);
				tmp_count += r7[tmp];
			}
			else if (tmp > 3) {
				h[i] = make_pair(8, tmp - 2);
				if (tmp - 2 >= 3) {
					h[i] = make_pair(-1, -1);
				}
				else
					tmp_count += r8[tmp-2];
			}
		}
		else if (h[i].first == 8) {
			if (tmp < 3) {
				h[i] = make_pair(8, tmp);
				tmp_count += r8[tmp];
			}
			else {
				h[i] = make_pair(-1, -1);
			}
		}
		int flag = false;
		for (int k = 0; k < 4; k++) {
			if (h[k] == make_pair(-1, -1))	continue;
			else if (k == i)	continue;
			if (h[k] == h[i]) {
				flag = true;
				break;
			}
		}
		if (flag == false) {
			MoveHorse(index + 1, h, tmp_count);
		}
		h[i] = tmp_h;
	}
}

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

	for (int i = 0; i < 4; i++) hr.push_back({ 1, 0 });

	MoveHorse(0,hr,0);
	cout << answer << endl;
}

'백준 알고리즘 > 구현' 카테고리의 다른 글

이차원 배열과 연산 C++  (0) 2021.10.19
게리멘더링 2 C++  (0) 2021.10.17
모노미노도미노 2  (0) 2021.10.15
청소년 상어 C++  (0) 2021.10.14
파이프 옮기기 C++  (0) 2021.10.14