2017년 9월 25일 월요일

Hanoi Tower with discription

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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#include<iostream>
using namespace std;
#define TOWERSIZE 5
class blocks { //하노이탑의 각 블록의 클래스화 입니다.
private:
    int blockSize; //해당 블록이 몇칸짜리인지 이 변수를 통해 알아냅니다.
public:
    void setBlockSize(int num) 
    {
        blockSize = num;
    }
    int getBlockSize() 
    {
        return blockSize;
    }
};
class lists { //from,tmp,to 탑을 클래스화 시켰습니다.
private:
    int top = -1; //stack을 위해 top변수를 만들었습니다.
    blocks blockslist[TOWERSIZE];//각 탑의 층수 입니다.
public:
    int getTop() 
    {
        return top;
    }
    void pushBlock(blocks in) 
    {
        blockslist[++top] = in;
    }
    blocks popBlock() 
    {
        return blockslist[top--];
    }
    int peekBlock() 
    {
        return (blockslist[top]).getBlockSize();
    }
    int peekSelectBlock(int selectedSize) //특정 위치를 peek하기위한 함수
    {
        return (blockslist[selectedSize]).getBlockSize();
    }
};
void printTower(lists *forPrint) {//탑 출력 함수, 세 탑을 인자값으로 받음
    int i = TOWERSIZE-1; //타워의 꼭대기부터 시작합니다. 
    while (i > -1) //1층까지 반복
    {
        cout << " ";
        if (forPrint[0].getTop() >= i) //탑의 꼭대기가, 현제층보다 같거나 클때 
        {
            int j = 0;
            for (; j < forPrint[0].peekSelectBlock(i); j++) //블럭의 사이즈만큼 *을 찍습니다.
                cout << "*";
            if (j != 5) //5칸을 다 못찍었다면
            {
                while (j != 5)  //남은칸은 whitespace
                {
                    cout << " ";
                    j++;
                }
            }
        }
        else //현제층이, 탑의 꼭대기보다 높으면
        {
            cout << "     ";//해당 층에는 아무 블럭도 없습니다.
        }
        cout << " ";
        if (forPrint[1].getTop() >= i)  // 두번째 탑
        {
            int j = 0;
            for (; j < forPrint[1].peekSelectBlock(i); j++) 
                cout << "*";
            if (j != 5) 
            {
                while (j != 5) 
                {
                    cout << " ";
                    j++;
                }
            }
        }
        else 
        {
            cout << "     ";
        }
        cout << " ";
        if (forPrint[2].getTop() >= i) //세번째 탑
        {
            int j = 0;
            for (; j < forPrint[2].peekSelectBlock(i); j++)
                cout << "*";
            if (j != 5) 
            {
                while (j != 5) 
                {
                    cout << " ";
                    j++;
                }
            }
        }
        else 
        {    
            cout << "     ";    
        }
        cout << endl;
        i -= 1; //다음층의 계산을 시작합니다.
    }
    cout << " ----- ----- -----" << endl; // 바닥.
}
void calcHanoi(int num, lists *from, lists *tmp, lists *to, lists *forprint)
{//하노이 계산 함수
    if (num == 1)
    {
        to->pushBlock(from->popBlock());
        printTower(forprint);
        return;//기존과는 달리, 블럭 클래스들을 stack을 이용해 list클래스에 붙혀줍니다.
    }        //118번줄은 이 작업을 담당합니다. 이동후 타워를 출력합니다.
    calcHanoi(num - 1, from, to, tmp, forprint);
    calcHanoi(1, from, tmp, to, forprint);
    calcHanoi(num - 1, tmp, from, to, forprint);
}
void main() {
    int num = TOWERSIZE;
    blocks block[TOWERSIZE]; //블럭 클래스를 생성합니다.
    lists list[3];            //타워 클래스를 생성합니다.
    for (int i = 0; i < num; i++) {
        block[i].setBlockSize(num - i);//블럭을 순서대로 초기화 합니다.
        list[0].pushBlock(block[i]);//from 탑에 순서대로 생성한 블럭을 쌓습니다.
    }
    //여기까지 초기화 작업
    calcHanoi(num, &list[0], &list[1], &list[2], &*list);
    
   cout<<"DONE"<<endl;
}
/*
    Sep,18 2017 19:21
    Creater        : Changwon J.
    Title        : HanoiTower 
    Version        : Ver 1.0
    Discription    : print HanoiTower as ordered, comment added
*/

간만에 코드짜니깐 겁나 더러운것.
혹시 과제 빼낄친구들이 있을수도 있으니,
9월 25일 이후에 공개할것.

댓글 없음:

댓글 쓰기