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 |
재귀호출을 사용하는 방식
728x90
728x90
'Dev > 알고리즘-자료구조' 카테고리의 다른 글
원형 연결 리스트 N개의 리스트에서 K번째 삭제하기 - [C] [자료구조] 구현하기(Circular Linked List) (0) | 2017.12.21 |
---|---|
[개탱][C][컴공과제][희소행렬의 합구하기][파일 입출력][구조체] (0) | 2017.12.21 |
[개탱][C언어][하노이탑][간단한 알고리즘][재귀][Stack][스택][그래픽화][그래픽][도형] (0) | 2017.12.21 |
[개탱][C언어][하노이탑][간단한 알고리즘][재귀호출][재귀함수][Stack][스택] (0) | 2017.12.21 |
[개탱][자료구조][C언어][Linked_List][Single Linked List] (0) | 2017.12.21 |