1. 程式人生 > >漢諾塔問題的非遞迴非堆疊演算法(二)

漢諾塔問題的非遞迴非堆疊演算法(二)

前一種方法的/*原理:
 如果把三個柱子圍成一個環,盤子總數為N,其移動的規律是:
 如果N為偶數:奇數號盤每次2步;偶數號盤每次1步;
 如果N為奇數:奇數號盤每次1步;偶數號盤每次2步;
 至於下一步該移動哪個柱子上的盤子,通過大小和順序即可判斷。
 
 以上可以通過數學證明,不贅述!
*/

以下是第二種演算法:

#include <iostream.h>
#include <math.h>
void main(){
 int tt = 1,ff=1,fff=1,t;
 cout<<"請輸入(1-64):";
 cin>> t;
 cout<<"F:表示盤子的起始柱子既From的意思"<<endl;
 cout<<"T:表示盤子的目標柱子既To的意思"<<endl;
 cout<<"o:表示在這一步中沒有用到的柱子"<<endl<<endl;
 for(int i1=1;i1<=t;i1++,ff*=2 );
 char **hand;
 hand=new char*[ff + 1];
 for(int i2=0;i2<ff+1;i2++) hand[i2] = new char[4];
 //char **hand=new char[ff + 1][ 4];    
 hand[0][1] = 'O';
 hand[0][2] = 'O';
 hand[0][3] = 'O';
 hand[1][1] = 'F';
 hand[1][2] = 'o';
 hand[1][3] = 'T';
 for(int i = 2;i<= t;i++){
  tt ++;
  if(fmod(i,2) == 0){
   hand[tt][ 1] = 'F';
   hand[tt][ 2] = 'T';
   hand[tt][ 3] = 'o';
  }
  else{
   hand[tt][ 1] = 'F';
   hand[tt][ 3] = 'T';
   hand[tt][ 2] = 'o';
  }
  fff=1;
  for(int h=1;h<=i-1;h++,fff*=2);
  for(int ii = 1;ii<= fff - 1;ii++)
  {tt ++;
  if(fmod(i, 2)== 0){
   hand[tt][ 1] = hand[ii][ 2];
   hand[tt][ 2] = hand[ii][ 3];
   hand[tt][ 3] = hand[ii][ 1];}
  else{
   hand[tt][ 1] = hand[ii][ 3];
   hand[tt][ 2] = hand[ii][ 1];
   hand[tt][ 3] = hand[ii][ 2];
  }
  }
 }
 if(fmod(t, 2) == 0){//調換位置
  for(int i = 1;i<=tt;i++){
   hand[i][ 0] = hand[i][ 2];
   hand[i][ 2] = hand[i][ 3];
   hand[i][ 3] = hand[i][ 0];}
 }
 for(int u=1;u<ff;u++ )
  cout<<u<<":  "<<hand[u][1]<<" "<<hand[u][2]<<" "<<hand[u][3]<<" "<<endl;
 cin>>fff;
}
}

相關推薦

問題的堆疊演算法

前一種方法的/*原理: 如果把三個柱子圍成一個環,盤子總數為N,其移動的規律是: 如果N為偶數:奇數號盤每次2步;偶數號盤每次1步; 如果N為奇數:奇數號盤每次1步;偶數號盤每次2步; 至於下一步該移動哪個柱子上的盤子,通過大小和順序即可判斷。  以上可以通過數學證明,不贅述

Python問題演算法與程式

漢諾塔問題: 問題來源:漢諾塔來源於印度傳說的一個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從上往下從小到大順序摞著64片黃金圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一回只能移動一個圓盤,只能移動在最頂端的圓盤。有預言說

問題求解python

漢諾塔問題遞迴求解(python) 漢諾塔(Hanoi)問題 古代有一個梵塔,塔內有三個座x,y,z壇,x座上有64個盤子,盤子大小不等,大的在下,小的在上。有一個和尚想把這64個盤子從x座移到z座,但每次只能允許移動一個盤子,並且在移動過程中,3個座上的盤子始終

實現演算法詳解

這裡我們再詳細地介紹一下漢諾塔的移動原理,假設三根柱子分別是 A、B、C,一開始 A 上有 N 個圓盤,從小到大、從上到下分別是 1、2……N-1、N,我們要把 A 上的 N 個圓盤全部移動到 C 上面,且每次只能移動每根柱子最上面的一個圓盤。 我們可以反過來考慮一下,若要把 A 上的圓盤全部移動到 C 上

如何理解?

在知乎上看到一個比較容易理解的 地址:https://www.zhihu.com/question/24385418 搞清楚遞迴只要搞清兩點: 結束條件(遞迴出口)把問題規模縮小在什麼是遞迴這個問題 李冰答主借用了網路上的一張圖片,非常形象,此處引用一下

從“”看演算法

  遞迴演算法是《資料結構與演算法》中最簡潔的演算法之一,它可以非常簡明地描述“減而治之”(decrease and conquer)和“分而治之”(divide and conquer)這兩種演算法思想。遞迴演算法雖然從程式碼角度來看非常簡單,但對於新手理解起

經典演算法 in python

   遞迴演算法,把大規模問題分解成容易解決而且求解方法相同的子問題,一般用遞迴函式實現,遞迴函式就是不斷呼叫自身的函式。    舉個例子:                  俄羅斯套娃(應該都玩過,裡面最小的那個不能開啟,其他能開啟。從最小的娃娃開始,用稍大的那個娃娃套

HDU 2064 III ()

//題意自己看,不懂度娘#include <stdio.h> #include <algorithm> #include <math.h> #include <

3: 與迭代實現

遞迴實現與main(): /*------------------------------------------------------ 漢諾塔主要是有三個塔座X,Y,Z,要求將從小到大編號為 1,2.....n 的 圓盤從X移動到塔座Z上,要求  (1):每次只能移動一

問題——時隔9個月,終於懂了

記得我第一次做漢諾塔這道題時,是2017年11月。當時,我坐在山大青島校區圖書館3樓,不知怎麼地,看到了這個題。 然後,就思考了一整天,233 當然,悲劇就是,我當時花了一天的時間還是沒有真正理解這道題遞迴的思路。 如今,我終於懂了,嘿嘿嘿。 關於遞迴: 一定不要

(優秀演算法)對經典問題的理解與講解部分引用大神程式碼,附連結。

部落格大神的優秀漢諾塔程式碼:喜歡特別冷的冬天下著雪   (侵權聯絡) 本文只是在大神思路的基礎上加以理解。 [cpp] view plain copy  print? #include <stdio.h> //第一個塔為初始塔,中間的塔為借用塔,

列舉排列組合C++

原文地址:http://www.25kx.com/art/1441000 最近心血來潮,想自己寫個求解排列組合的小東西。以2個數組為例: arr1 = {'a', 'b', 'c'}; arr2={'1', '2'}; ,將陣列中元素的所有排列組合枚舉出來:a1 , a2, b1, b2,

問題歸算法分析

分解 cnblogs 算法 http 裏的 scan .com orm .cn 轉自:http://www.cnblogs.com/zhangqqqf/archive/2008/09/12/1289730.html 一個廟裏有三個柱子,第一個有64個盤子,從上往下盤子越來越

二分查詢使用方式和使用迴圈的方式來實現

二分查詢是一種查詢效率非常高的查詢演算法。又稱折半查詢。 二分查詢演算法思想 有序的序列,每次都是以序列的中間位置的數來與待查詢的關鍵字進行比較,每次縮小一半的查詢範圍,直到匹配成功。 一個情景:將表中間位置記錄的關鍵字與查詢關鍵字比較,如果兩者相等,則查詢成功;否

【LeetCode】 230. Kth Smallest Element in a BST中序遍歷叉樹

因為這是一棵二叉搜尋樹,所以找它的第 kkk 小值,就是這棵二叉搜尋樹的中序遍歷之後的第 kkk 個數,所以只需要將這棵樹進行中序遍歷即可,下面程式碼是非遞迴形式的二叉樹中序遍歷。 程式碼如下: /**

資料結構六:叉樹的先序建樹與中序的遍歷演算法

         熟悉二叉樹的遍歷建樹過程有利於對後文線索化二叉樹的學習          對於資料結構中二叉樹特殊的結構,經過一段時間的溫習發現自己基礎並不是很牢靠,所以寫下這篇博文也是記錄一下自己

叉樹的遍歷演算法

看了一篇部落格上對二叉樹的非遞迴遍歷的總結,非常不錯,記錄一下; /** 非遞迴實現前序遍歷 */ protected static void iterativePreorder(Node p) { Stack<Node> stack = n

樹:叉樹的遍歷演算法

二叉樹的遞迴遍歷 二叉樹的遞迴遍歷演算法,寫法很簡單,比如說前序遍歷樹,如下: //前序遍歷 void PreOrderTraverse(BiTree tree) { if (NULL != tree) { VisitNode(tree->data); P

、棧、棧實現叉樹的遍歷

先序遍歷的三種演算法: //遞迴實現先序遍歷 void preorderTree(binNode<Elem>* root){ if(root==NULL){ return; } else{ cout<<root->getE

,不用棧實現叉樹中序遍歷

  最近總有人問這個問題:“如何不用棧,也不用遞迴來實現二叉樹的中序遍歷”。這個問題的實現就是迭代器問題,無論是Java還是C++,利用迭代器遍歷樹節點(Java中是TreeMap類,C++中是map類)都使用了中序遍歷,且無法使用遞迴和棧,演算法效率近似為O(1),不可能