일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 마법의숲탐색
- 시뮬레이션
- 조합
- 3Dreconstruction
- 순서대로방문하기
- 토끼와 경주
- 왕실의기사대결
- 수영대회결승전
- 슈퍼컴퓨터클러스터
- ICER
- 백준
- BFS
- 코드트리빵
- dfs
- ISER
- 포탑부수기
- 코드트리
- Calibration
- ros
- 루돌프의반란
- ARM
- 삼성기출
- 소프티어
- 나무박멸
- DenseDepth
- DP
- 구현
- 마이크로프로세서
- 싸움땅
- 이진탐색
Archives
- Today
- Total
from palette import colorful_colors
[백준] 17825 주사위 윷놀이 with C++ (삼성기출) 본문
https://www.acmicpc.net/problem/17825
언어: C++, 소요시간: 8ms
완탐을 타면서 체크한다!
하드코딩해서 편하게 하도록 유도했다.
재귀 타고 난 다음 복구하는 것 잊지말기
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int answer;
int players[4]; // player 위치 넣는다
int playerMAP[33]; // 해당 칸에 플레이어가 있는지 여부
int dice[10];
vector <int> MAP[33] = {
{1}, {2}, {3}, {4}, {5}, // 0 ~ 4
{6, 21}, {7}, {8}, {9}, {10}, // 5 ~ 9
{11,25}, {12}, {13}, {14}, {15}, // 10 ~ 14
{16, 27}, {17}, {18}, {19}, {20}, // 15 ~ 19
{32}, {22}, {23}, {24}, {30}, // 20 ~ 24
{26}, {24}, {28}, {29}, {24}, // 25 ~ 29
{31}, {20}, {32} // 30 ~ 32
};
int scoreMAP[33]{
0, 2, 4, 6, 8, // 0~4
10, 12, 14, 16, 18, // 5~9
20, 22, 24, 26, 28, // 10 ~ 14
30, 32, 34, 36, 38, // 15 ~ 19
40, 13, 16, 19, 25, // 20 ~ 24
22, 24, 28, 27, 26, // 25 ~ 29
30, 35, 0 // 30 ~ 32
};
void func(int level, int curScore) {
// 주사위를 다 돌렸으면 최대점수 업데이트
if (level == 10) {
answer = max(answer, curScore);
return;
}
for (int i = 0; i < 4; i++){
int curPosition = players[i]; // 현재 말의 위치
int target; // 다음에 갈 수 있는 위치
// 한 칸씩만 이동해본다
if (MAP[players[i]].size() == 2)
target = MAP[curPosition][1];
else
target = MAP[curPosition][0];
// 이미 한 칸 이동했으니 1부터 시작해서 for문 돌리기
for (int j = 1; j < dice[level]; j++)
target = MAP[target][0];
// 도착했거나, 도착한 지점에 플레이어가 아무도 없을때 재귀타기
if (target == 32 || (target != 32 && playerMAP[target] == 0)) {
// 해당 말 위치 업데이트
playerMAP[curPosition] = 0;
playerMAP[target] = 1;
players[i] = target;
// 재귀타기
func(level + 1, curScore + scoreMAP[target]);
// 해당 말 위치 원복
players[i] = curPosition;
playerMAP[target] = 0;
playerMAP[curPosition] = 1; // 원래 있던 위치로 말 되돌리기!
}
}
}
int main() {
//freopen("sample_input.txt", "r", stdin);
for (int i = 0; i < 10; i++){
cin >> dice[i];
}
func(0, 0);
cout << answer;
return 0;
}
참고 블로그:
'알고리즘 > 문제풀이' 카테고리의 다른 글
[코드트리] 예술성 with C++ (삼성기출) (0) | 2024.04.21 |
---|---|
[코드트리] 마법의 숲 탐색 with C++ (삼성기출) (1) | 2024.04.19 |
[코드트리] 나무박멸 with C++ (삼성기출) (0) | 2024.04.13 |
[SWEA] 4193 수영대회 결승전 with C++ (0) | 2024.04.13 |
[코드트리] 꼬리잡기놀이 with C++ (삼성기출) (0) | 2024.04.12 |