알고리즘/[문제풀이] BOJ
[BOJ] 17825 - 주사위 윷놀이
be-lgreen
2021. 10. 22. 22:24
https://www.acmicpc.net/problem/17825
17825번: 주사위 윷놀이
주사위 윷놀이는 다음과 같은 게임판에서 하는 게임이다. 처음에는 시작 칸에 말 4개가 있다. 말은 게임판에 그려진 화살표의 방향대로만 이동할 수 있다. 말이 파란색 칸에서 이동을 시작하면
www.acmicpc.net
난이도
구현 + bfs / 난이도 ⭐️⭐️/ 1시간 35분
// board 0번째 줄 좌표 잘못 잡음
#include <stdio.h>
#include <vector>
using namespace std;
vector<vector<int> > board;
vector<int> dice;
int loc[4][2];
int check[5][22];
/*
0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40
10 13 16 19 25
20 22 24 25
30 28 27 26 25
25 30 35 40
0 4 -> 1 0
0 9 -> 2 0
0 14 -> 3 0
1 4 -> 4 0
2 3 -> 4 0
3 4 -> 4 0
4 3 -> 0 18
*/
int answer;
void dfs(int dice_index, int sum)
{
if (sum > answer)
{
answer = sum;
}
if (dice_index >= 10)
{
// printf("sum: %d\n", sum);
return;
}
int x, y, newx, newy;
for (int i = 0; i < 4; i++)
{
x = loc[i][0];
y = loc[i][1];
if (x == 0 && y > board[0].size() - 1)
{
continue;
}
newx = x;
newy = y;
if (newx == 0)
{
if (newy == 5)
{
newx = 1;
newy = 0;
}
else if (newy == 10)
{
newx = 2;
newy = 0;
}
else if (newy == 15)
{
newx = 3;
newy = 0;
}
}
for (int j = 0; j < dice[dice_index]; j++)
{
newy += 1;
if (newx == 1 && newy == 4)
{
newx = 4;
newy = 0;
}
else if (newx == 2 && newy == 3)
{
newx = 4;
newy = 0;
}
else if (newx == 3 && newy == 4)
{
newx = 4;
newy = 0;
}
else if (newx == 4 && newy == 3)
{
newx = 0;
newy = board[0].size() - 1;
}
}
// printf("%d %d\n", newx, newy);
if (check[newx][newy] != -1)
{
continue;
}
if (newx == 0 && newy > board[0].size() - 1) // check point 2)
{
check[x][y] = -1;
loc[i][0] = newx;
loc[i][1] = newy;
dfs(dice_index + 1, sum);
loc[i][0] = x;
loc[i][1] = y;
check[x][y] = i;
}
else
{
check[x][y] = -1;
check[newx][newy] = i;
loc[i][0] = newx;
loc[i][1] = newy;
// printf("i, x, y: %d (%d %d), (%d %d)\n", i, x, y, newx, newy);
// dfs
dfs(dice_index + 1, sum + board[newx][newy]);
// reset
loc[i][0] = x;
loc[i][1] = y;
check[newx][newy] = -1;
check[x][y] = i;
}
}
}
void init()
{
int temp;
for (int i = 0; i < 10; i++)
{
scanf("%d", &temp);
dice.push_back(temp);
}
vector<int> line1;
for (int i = 0; i <= 40; i += 2)
{
line1.push_back(i);
}
board.push_back(line1);
vector<int> line2;
line2.push_back(10);
line2.push_back(13);
line2.push_back(16);
line2.push_back(19);
line2.push_back(25);
board.push_back(line2);
// 20 22 24 25
vector<int> line3;
line3.push_back(20);
line3.push_back(22);
line3.push_back(24);
line3.push_back(25);
board.push_back(line3);
// 30 28 27 26 25
vector<int> line4;
line4.push_back(30);
line4.push_back(28);
line4.push_back(27);
line4.push_back(26);
line4.push_back(25);
board.push_back(line4);
// 25 30 35 40
vector<int> line5;
line5.push_back(25);
line5.push_back(30);
line5.push_back(35);
line5.push_back(40);
board.push_back(line5);
// for (int i = 0; i < dice.size(); i++)
// {
// printf("%d ", dice[i]);
// }
// printf("\n");
// for (int i = 0; i < board.size(); i++)
// {
// for (int j = 0; j < board[i].size(); j++)
// {
// printf("%d ", board[i][j]);
// }
// printf("\n");
// }
// printf("\n");
}
int main()
{
// loc[4][2] = {0};
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 22; j++)
{
check[i][j] = -1;
}
}
init();
answer = 0;
dfs(0, 0);
printf("%d", answer);
}