1. 程式人生 > >hanoi塔的遞迴以及非遞迴函式

hanoi塔的遞迴以及非遞迴函式

/**
 * @file 	Hanoi.c
 * @brief
 *	<li>Function: Hanoi塔的遞迴以及非遞迴解法</li>
 *  <li>Design Points:</li>
 *  <p>
 *  
 *  </p>
 * @author 	Administrator
 * @date 	2010-10-21
 * 
 */
#include <stdio.h>

#define A (0x01)
#define B (0x02)
#define C (0x04)
#define MASK (0x07)
#define STK_SIZE 40 /*非遞迴解法的棧大小*/

/*獲取除first和second另外一個柱子*/
#define OTHER(first,second)  (~((first) | (second)) & MASK)

typedef unsigned char Column;
/**
 * 列印時結果時的字元轉換
 */
char transfer(Column c)
{
    switch (c)
    {
        case A:
            return 'A';
        case B:
            return 'B';
        case C:
            return 'C';
        default:
            return 'X';
    }
}
/**
 * 將盤子從from移動至to
 */
void move(Column from, Column to)
{
    char chfrom = transfer(from);
    char chto = transfer(to);
    printf("move from %c to %c\n", chfrom, chto);
}

/**
 * 遞迴解法
 */
void recursHanoi(Column from, Column to, int num)
{
    if (num == 1)
    {
        move(from, to);
        return;
    }
    Column other = OTHER(from,to);
    recursHanoi(from, other, num - 1);
    move(from, to);
    recursHanoi(other, to, num - 1);
    return;
}

typedef struct
{
    Column src;
    Column dst;
    int num; /*需要移動的盤子數*/
    int state;
} Attempt;

/**
 * 非遞迴解法
 * 針對求解的二叉樹構造中序遍歷
 */
void norecurseHanoi(Column from, Column to, int num)
{
    Attempt firtattp = { from, to, num, 0};
    Attempt stk[STK_SIZE];  /*申明堆疊*/
    int top = -1; /*棧頂*/
    Attempt crtatt;

    stk[++top] = firtattp;
    while (top != -1)
    {
        if (stk[top].state == 0 && stk[top].num > 1) /*當左邊的節點還未訪問時*/
        {
            stk[top].state = 1;
            crtatt.src = stk[top].src;
            crtatt.dst = OTHER(stk[top].src,stk[top].dst);
            crtatt.num = stk[top].num-1;
            crtatt.state = 0;
            stk[++top] = crtatt;    /*入棧*/
        }else if (stk[top].state == 1){/*右邊的節點還未訪問時*/
            move(stk[top].src,stk[top].dst);
            crtatt.src = OTHER(stk[top].src, stk[top].dst);
            crtatt.dst = stk[top].dst;
            crtatt.num = stk[top].num-1;
            crtatt.state = 0;
            top--;  /*出棧*/
            stk[++top] = crtatt;    /*入棧*/
        }else if (stk[top].num <= 1){
            move(stk[top].src, stk[top].dst);
            top--;
        }
    }
}

int main()
{
    printf("*******recurse solution**********\n");
    recursHanoi(A, C,5);
    printf("*******none-recurse solution**********\n");
    norecurseHanoi(A, C, 5);
    return 0;
}



相關推薦

hanoi以及函式

/** * @file Hanoi.c * @brief * <li>Function: Hanoi塔的遞迴以及非遞迴解法</li> * <li>Design Points:</li> * <p>

二叉樹——前、中、後序遍歷以及寫法

#include <iostream> #include <stack> #include <queue> using namespace std; typedef struct Node{ int data; Node *l

二叉樹遍歷:前序,中序,後序,層序的以及實現

樹,是一種在實際程式設計中經常遇到的資料結構,它的邏輯很簡單:除根節點之外每個節點都有且只有一個父節點,除葉子節點之外所有節點都有一個或多個子節點。我們說的二叉樹,就是指子節點最多2個的樹。 二叉樹中,最重要的操作就是遍歷。二叉樹的遍歷分為: 1.前序遍歷:先訪問根節點,

【LeetCode】Binary Tree Inorder Traversal 二叉樹中序遍歷以及演算法

  Total Accepted: 16494 Total Submissions: 47494 Given a binary tree, return the inorder traversal of its nodes' values. For example: Giv

【LeetCode】Binary Tree Preorder Traversal 二叉樹前序遍歷以及演算法

  Total Accepted: 17403 Total Submissions: 50093 My Submissions Given a binary tree, return the preorder traversal of its nodes' values.

【LeetCode】Binary Tree Postorder Traversal 二叉樹後序遍歷以及演算法

Total Accepted: 15614 Total Submissions: 50928 My Submissions Given a binary tree, return the postorder traversal of its nodes' values.

(原始碼,具體的細節請查閱相關資料)哈弗曼樹的構造以及遍歷樹

  寫了一點haffman樹的建立和二叉樹的非遞迴遍歷. 如果編寫程式碼的時候出現了,思維斷點,可以借鑑一下, 避免浪費一些不必要的時間. 我是佔位符我是佔位符我是佔位符我是佔位符我是佔位符我是佔位符我是佔位符我是佔位符我是佔位符我是佔位符我是佔位符我是佔

c++二叉樹的的前序中序和後序遍歷以及層序遍歷

二叉樹的遞迴版的前序,中序和後序遍歷很簡單也很容易理解,這裡就放一個前序遍歷的例子 //前序遍歷遞迴演算法,遞迴演算法都大同小異,這裡就不一一列舉了 void binaryTree::pro_order(NodeStack::Node *t) { NodeStack::Node *h = t;

演算法--全排列,去重全排列以及實現

問題1: 給定字串1234無重複字元,求其所有排列 遞迴方式求解: def swap(num, i, j): tmp = num[i] num[i] = num[j] num[j] = tmp #num無重複數字 def fullSort(num, index)

漢諾的改編題(用棧求解,分別

限制不能從最左側的塔直接移動到最右側,也不能從最右側直接移動到最左側,而是必須經過中間,求當塔有N層的時候,列印最優移動過程和最優移動總步數 例如:當塔為兩層時,最上層的塔記為1,最下層的塔記為2,則

實驗三:二叉樹的操作(結構轉換,的先序、中序和後序遍歷,以及層次遍歷,葉子結點和總結點的計數)

(1)將一棵二叉樹的所有結點儲存在一維陣列中,虛結點用#表示,利用二叉樹性質5,建立二叉樹的二叉連結串列。 (2) 寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。 (4)求二叉樹

漢諾演算法

1. 基本遞迴演算法: 原文:https://blog.csdn.net/hehe5229/article/details/60874167 #include<stdio.h>   #include<stdlib.h>   int count=0; &

兩種辦法計算Hanoi問題

#include "stdafx.h"#include <iostream.h>#include <stack>#include <map>using namespace std; void Move(int nFrom,int nTo);void Hanoi1(int

漢諾問題的演算法

       漢諾塔問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能

漢諾(必須經過中間柱子)詳解與程式碼實現

首先介紹一下漢諾塔最初始的規則: 有三根相鄰的柱子,標號為A,B,C,A柱子從上到下按照金字塔狀疊放著n個不同大小的圓盤,現在把所有的盤子一個一個移動到柱子B上,並且每次移動同一根柱子上都不能出現大盤子在小盤子上方。 這是最初始的規則,實現的思路可以分為

二叉樹建立以及遍歷(方式)

#include <iostream> #include <assert.h> #include <stack> using namespace std; typedef struct biTreeNode { c

資料結構-樹以及深度、廣度優先遍歷(,python實現)

前面我們介紹了佇列、堆疊、連結串列,你親自動手實踐了嗎?今天我們來到了樹的部分,樹在資料結構中是非常重要的一部分,樹的應用有很多很多,樹的種類也有很多很多,今天我們就先來建立一個普通的樹。其他各種各樣的樹將來我將會一一為大家介紹,記得關注我的文章哦~ 首先,樹的形狀就是類似這個樣子的: 它最頂上面的點叫做

二叉樹的先序/中序/後序()+層序遍歷

queue 的基本操作舉例如下: queue入隊,如例:q.push(x); 將x 接到佇列的末端。 queue出隊,如例:q.pop(); 彈出佇列的第一個元素,注意,並不會返回被彈出元素的值。 訪問queue隊首元素,如例:q.front(),即最早被壓入佇列的元素。 訪問que

一列數字的規則如下;1,1,2,3,5,8,13,21,34........ 求第30位數字是多少,用規和兩種方法演算法實現

斐波納契數列(Fibonacci Sequence),又稱黃金分割數列。在數學上,斐波納契數列以如下被以遞迴的方法定義:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用,現在我從演算法的角度,利用遞迴和非

二叉樹的前序,中序,後序的遍歷的程式碼-C語言

#include <stdio.h> #include<stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input l