DY N DY

실력키우기 주사위던지기1(C++) 본문

PARK/ALGORITHM

실력키우기 주사위던지기1(C++)

손세지 2016. 8. 7. 23:17

1169 : 주사위 던지기1

제한시간: 1000 ms    메모리제한: 32 MB
해결횟수: 592 회    시도횟수: 1319 회   



주사위를 던진 횟수 N과 출력형식 M을 입력 받아서 M의 값에 따라 각각 아래와 같이 출력하는 프로그램을 작성하시오.

 

M = 1 : 주사위를 N번 던져서 나올 수 있는 모든 경우
M = 2 : 주사위를 N번 던져서 중복이 되는 경우를 제외하고 나올 수 있는 모든 경우
M = 3 : 주사위를 N번 던져서 모두 다른 수가 나올 수 있는 모든 경우

 

* 중복의 예
1 1 2 와 중복 : 1 2 1, 2 1 1
1 2 3 과 중복 : 1 3 2, 2 1 3, 2 3 1, 3 1 2

 

첫 줄에 주사위를 던진 횟수 N(2≤N≤5)과 출력모양 M(1≤M≤3)이 들어온다.



주사위를 던진 횟수 N에 대한 출력모양을 출력한다.
작은 숫자부터 출력한다.


 [Copy]
3 1
 [Copy]
1 1 1
1 1 2
1 1 3
1 1 4
1 1 5
1 1 6
1 2 1
…
6 6 6



 [Copy]
3 2
 [Copy]
1 1 1
1 1 2
…
1 1 6
1 2 2
…
5 6 6
6 6 6



 [Copy]
3 3
 [Copy]
1 2 3
1 2 4
1 2 5
1 2 6
1 3 2
1 3 4
…
6 5 3
6 5 4
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/**************************************************************
    Problem: 1169
    User: a132034
    Language: C++
    Result: Success
    Time:12 ms
    Memory:1740 kb
****************************************************************/
 
 
#include    <iostream>
using namespace std;
 
static int dice[5];
static int loc = 1;
void Throw(int N, int M);
int main()
{
    int N, M;
    cin >> N >> M;
    dice[0] = 1;
    Throw(N, M);
 
    return 0;
}
 
void Throw(int N, int M)
{
 
    if (M == 1)
    {
        for (int i = 1; i <= 6; ++i)
        {
            dice[loc] = i;
 
            if (loc == N)
            {
                for (int j = 1; j <= N; ++j)
                    cout << dice[j] << " ";
                cout << endl;
            }
            else
            {
                loc++;
                Throw(N, M);
                loc--;
            }
        }
    }
    else if (M == 2)
    {
        for (int i = dice[loc - 1]; i <= 6; ++i)
        {
            dice[loc] = i;
 
            if (loc == N)
            {
                for (int j = 1; j <= N; ++j)
                    cout << dice[j] << " ";
                cout << endl;
            }
            else
            {
                loc++;
                Throw(N, M);
                loc--;
            }
        }
    }
    else if (M == 3)
    {
        for (int i = 1; i <= 6; ++i)
        {
            bool flg = true;
            for (int k = 1; k < loc; ++k)
            {
                if (dice[k] == i)
                    flg = false;
            }
            if (!flg)
                continue;
            dice[loc] = i;
 
            if (loc == N)
            {
                for (int j = 1; j <= N; ++j)
                    cout << dice[j] << " ";
                cout << endl;
            }
            else
            {
                loc++;
                Throw(N, M);
                loc--;
            }
        }
    }
}


기존에 풀었던 기초다지기를 응용해서 풀었다. 

590 : 함수3 - 자가진단4 http://dyndy.tistory.com/135

자세한 설명은 여기 있으며 2번의 경우와 완전 동일하다. 
1번의 경우 시작을 2번과 같이 (52번줄이 2번의 시작, 32번줄이 1번의 시작) 전 주사위 숫자가 아닌 1부터 시작하는 것으로 변경해주었더니 간단히 해결되었고, 

3번의 경우 bool값을 추가하여 이전의 주사위에 없는 숫자일 경우에만 기존 루프를 돌게 하고 그 외에는 continue로 바로 다음 i값을 주사위값에 넣을지 말지 검사하는 방법을 이용해서 간단히 풀었다.