https://www.acmicpc.net/problem/17825
#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 |