홍시홍의 프로그래밍

[백준 17825] 윷놀이 본문

알고리즘 문제풀이/백준

[백준 17825] 윷놀이

홍시홍 2020. 6. 5. 22:58

분류 

시뮬레이션, 구현

요구사항

다이스의 순서가 주어졌을 때, 최대로 얻을 수 있는 점수 구하기

풀이

1. 말의 순서를 정한다

2. 순서를 정한대로 말을 출발 시켜 본다

 

쉬운 풀이도 있으나

나는 모든 칸에 대해서 시뮬레이션을 했다.

이렇게 풀어도 2시간 이내에는 푸는데 좋지 않은 방법이고 디버깅도 하기 어려울것이다.....

하지만 이렇게도 풀 수 있다라는걸 보여주는 풀이방법

 

#include <iostream>
#include <queue>
#include <algorithm>
#include <math.h>
#include <string.h>
using namespace std;
int dice[13];
vector<int> v;
int visit[33];
int ccnt = 0;
int ans = 0;
int board[33] =
{
	0,
	2,4,6,8,10,
	12,14,16,18,20,
	22,24,26,28,30,
	32,34,36,38,40,
	13,16,19,
	25,
	22,24,
	28,27,26,
	30,35 };
int godice(int now, int cnt) {
	int next = now + cnt;
	if (next>20) return 100;
	return next;
}
int innerdice(int now, int cnt) {
	int next = 0;
	if (now == 21) {
		if (cnt == 1) return next = 22;
		else if (cnt == 2) return next = 23;
		else if (cnt == 3) return next = 24;
		else if (cnt == 4) return next = 30;
		else if (cnt == 5) return next = 31;
	}
	else if (now == 22) {
		if (cnt == 1) return next = 23;
		else if (cnt == 2) return next = 24;
		else if (cnt == 3) return next = 30;
		else if (cnt == 4) return next = 31;
		else if (cnt == 5) return next = 20;
	}
	else if (now == 23) {
		if (cnt == 1) return next = 24;
		else if (cnt == 2) return next = 30;
		else if (cnt == 3) return next = 31;
		else if (cnt == 4) return next = 20;
		else if (cnt == 5) return next = 100;
	}
	else if (now == 24) {
		if (cnt == 1) return next = 30;
		else if (cnt == 2) return next = 31;
		else if (cnt == 3) return next = 20;
		else if (cnt == 4) return next = 100;
		else if (cnt == 5) return next = 100;
	}
	else if (now == 25) {
		if (cnt == 1) return next = 26;
		else if (cnt == 2) return next = 24;
		else if (cnt == 3) return next = 30;
		else if (cnt == 4) return next = 31;
		else if (cnt == 5) return next = 20;
	}
	else if (now == 26) {
		if (cnt == 1) return next = 24;
		else if (cnt == 2) return next = 30;
		else if (cnt == 3) return next = 31;
		else if (cnt == 4) return next = 20;
		else if (cnt == 5) return next = 100;
	}
	else if (now == 27) {
		if (cnt == 1) return next = 28;
		else if (cnt == 2) return next = 29;
		else if (cnt == 3) return next = 24;
		else if (cnt == 4) return next = 30;
		else if (cnt == 5) return next = 31;
	}
	else if (now == 28) {
		if (cnt == 1) return next = 29;
		else if (cnt == 2) return next = 24;
		else if (cnt == 3) return next = 30;
		else if (cnt == 4) return next = 31;
		else if (cnt == 5) return next = 20;
	}
	else if (now == 29) {
		if (cnt == 1) return next = 24;
		else if (cnt == 2) return next = 30;
		else if (cnt == 3) return next = 31;
		else if (cnt == 4) return next = 20;
		else if (cnt == 5) return next = 100;
	}
	else if (now == 30) {
		if (cnt == 1) return next = 31;
		else if (cnt == 2) return next = 20;
		else if (cnt == 3) return next = 100;
		else if (cnt == 4) return next = 100;
		else if (cnt == 5) return next = 100;
	}
	else if (now == 31) {
		if (cnt == 1) return next = 20;
		else if (cnt == 2) return next = 100;
		else if (cnt == 3) return next = 100;
		else if (cnt == 4) return next = 100;
		else if (cnt == 5) return next = 100;
	}
}
int check(int now) {
	if (now == 0 || now == 1 || now == 2 || now == 3 || now == 4 || now == 6 || now == 7 || now == 8 || now == 9 ||
		now == 11 || now == 12 || now == 13 || now == 14 || now == 16 || now == 17 || now == 18 || now == 19 || now == 20)
		return 1;
	else if (now == 5 || now == 10 || now == 15)
		return 2;
	else if (now == 21 || now == 22 || now == 23 || now == 24 || now == 25 || now == 26 || now == 27 || now == 28 || now == 29 ||
		now == 30 || now == 31)
		return 3;
}
int playgame() {
	memset(visit, 0, sizeof(visit));
	int d[5] = { 0, };
	int goal[5] = { 0, };
	int nowans = 0;
	for (int i = 0; i < 10; i++) {
		//현재 
		//	cout<<i<<" ";
		if (goal[v[i]] == 1) return 0;
		//cout<<v[i]<<" ";
		int nowpos = d[v[i]];
		visit[d[v[i]]] = 0;
		if (check(nowpos) == 1) {
			int next = godice(d[v[i]], dice[i]);
			if (next == 100) {
				goal[v[i]] = 1;
				continue;
			}
			if (visit[next] == 1) return 0;
			visit[next] = 1;
			d[v[i]] = next;
			nowans += board[next];
		}
		else if (check(nowpos) == 2) {
			if (nowpos == 5) {
				if (dice[i] == 1) {
					int next = 21;
					if (visit[next] == 1) return 0;
					visit[next] = 1;
					d[v[i]] = 21;
					nowans += board[21];
				}
				else if (dice[i] == 2) {
					int next = 22;
					if (visit[next] == 1) return 0;
					visit[next] = 1;
					d[v[i]] = 22;
					nowans += board[22];
				}
				else if (dice[i] == 3) {
					int next = 23;
					if (visit[next] == 1) return 0;
					visit[next] = 1;
					d[v[i]] = 23;
					nowans += board[23];
				}
				else if (dice[i] == 4) {
					int next = 24;
					if (visit[next] == 1) return 0;
					visit[next] = 1;
					d[v[i]] = 24;
					nowans += board[24];
				}
				else if (dice[i] == 5) {
					int next = 30;
					if (visit[next] == 1) return 0;
					visit[next] = 1;
					d[v[i]] = 30;
					nowans += board[30];
				}
			}
			else if (nowpos == 10) {
				if (dice[i] == 1) {
					int next = 25;
					if (visit[next] == 1) return 0;
					visit[next] = 1;
					d[v[i]] = 25;
					nowans += board[25];
				}
				else if (dice[i] == 2) {
					int next = 26;
					if (visit[next] == 1) return 0;
					visit[next] = 1;
					d[v[i]] = 26;
					nowans += board[26];
				}
				else if (dice[i] == 3) {
					int next = 24;
					if (visit[next] == 1) return 0;
					visit[next] = 1;
					d[v[i]] = 24;
					nowans += board[24];
				}
				else if (dice[i] == 4) {
					int next = 30;
					if (visit[next] == 1) return 0;
					visit[next] = 1;
					d[v[i]] = 30;
					nowans += board[30];
				}
				else if (dice[i] == 5) {
					int next = 31;
					if (visit[next] == 1) return 0;
					visit[next] = 1;
					d[v[i]] = 31;
					nowans += board[31];
				}
			}
			else if (nowpos == 15) {
				if (dice[i] == 1) {
					int next = 27;
					if (visit[next] == 1) return 0;
					visit[next] = 1;
					d[v[i]] = 27;
					nowans += board[27];
				}
				else if (dice[i] == 2) {
					int next = 28;
					if (visit[next] == 1) return 0;
					visit[next] = 1;
					d[v[i]] = 28;
					nowans += board[28];
				}
				else if (dice[i] == 3) {
					int next = 29;
					if (visit[next] == 1) return 0;
					visit[next] = 1;
					d[v[i]] = 29;
					nowans += board[29];
				}
				else if (dice[i] == 4) {
					int next = 24;
					if (visit[next] == 1) return 0;
					visit[next] = 1;
					d[v[i]] = 24;
					nowans += board[24];
				}
				else if (dice[i] == 5) {
					int next = 30;
					if (visit[next] == 1) return 0;
					visit[next] = 1;
					d[v[i]] = 30;
					nowans += board[30];
				}
			}
		}
		else if (check(nowpos) == 3) {
			int next = innerdice(nowpos, dice[i]);
			if (next == 100) {
				goal[v[i]] = 1;
				continue;
			}
			if (visit[next] == 1) return 0;
			visit[next] = 1;
			d[v[i]] = next;
			nowans += board[next];
		}
	}
	//	cout<<"A"<<endl;
	//	cout<<nowans<<endl;
	return nowans;


}
void dfs(int cnt, int num) {
	if (cnt == 11) {
		//cout<<"In"<<endl;
		int tempans = playgame();
		//cout<<"Out"<<endl;
		ans = max(ans, tempans);
		//cout<<tempans<<endl;
		return;
	}
	for (int i = 1; i <= 4; i++) {
		v.push_back(i);
		dfs(cnt + 1, num + 1);
		v.pop_back();
	}
}


int main() {
	for (int i = 0; i <10; i++) {
		scanf("%d", &dice[i]);
	}
	dfs(1, 1);
	cout << ans << endl;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 16918] 붐버맨  (0) 2020.05.28
[백준 9012] 괄호  (0) 2020.05.28
[백준 14923] 미로 탈출  (0) 2020.05.27
[백준 17090] 미로 탈출하기  (0) 2020.05.27
[백준 14891] 톱니바퀴  (0) 2020.05.26
Comments