본문 바로가기
알고리즘-자료구조

[개탱][C언어][하노이탑][간단한 알고리즘][비재귀][Stack][스택][while]

by 개탱 2017. 12. 21.
728x90

재귀호출을 사용하지 않고 while 문을 사용한 하노이탑


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
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <cmath>
#include <list>
using namespace std;
int n;
//void hanoi(int n, char from, char tmp, char to);
 typedef struct tagInfo
 {
    int iNum;
    int iFrom;
    int iTemp;
    int iTo;
    int iMod;
    tagInfo(){};
    tagInfo(int _iN, int _iF, int _iT, int _iTo, int _iM) 
    {
        iNum = _iN;
        iFrom = _iF;
        iTemp = _iT;
        iTo = _iTo;
        iMod =  _iM;
    }
 }INFO;
int main() {
    // '1', '2', '3'
    scanf("%d",&n);
    int iNum;
    int iFrom = 1;
    int iTemp = 2;
    int iTo = 3;
    int iTop = 0;
    list<INFO> Stack;
    INFO t_Info;
    iNum = n;
    Stack.push_back(INFO(iNum,iFrom,iTemp,iTo,1));
    printf("%d\n",(int)pow(2,n)-1);
    while(!Stack.empty() && Stack.front().iMod < 4)
    {
        iNum = Stack.back().iNum;
        iFrom  = Stack.back().iFrom;
        iTemp  = Stack.back().iTemp;
        iTo  = Stack.back().iTo;
        if(iNum == 1)
        {
            printf("%d %d\n",iFrom,iTo);
            Stack.pop_back();
            if(!Stack.empty())
            {
                Stack.back().iMod++;
                while(!Stack.empty() && Stack.back().iMod >= 4)
                {
                    Stack.pop_back();
                    if(!Stack.empty())
                        Stack.back().iMod++;
                }
            }
            iTop--;
        }else
        {
            if(Stack.back().iMod == 1)
                Stack.push_back(INFO(--iNum,iFrom,iTo,iTemp,1));
            else if(Stack.back().iMod == 2)
                Stack.push_back(INFO(1,iFrom,iTemp,iTo,1));
            else if(Stack.back().iMod == 3)
                Stack.push_back(INFO(--iNum,iTemp,iFrom,iTo,1));
            iTop++;
        }
        
    }
}
 
cs

재귀호출을 사용하는 방식


댓글