青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

/*
問題描述:有三個柱子A, B, C. A柱子上疊放有n個盤子,每個盤子都比它下面的盤子要小一點,
可以從上到下用1, 2, ..., n編號。要求借助柱子B,把柱子A上的所有的盤子移動到柱子C上。
移動條件為:1、一次只能移一個盤子;
2、移動過程中大盤子不能放在小盤子上,只能小盤子放在大盤子上。
*/
/*
遞歸的算法相信大多數人都知道,非遞歸算法也有出現過。
如:摘自http://www.programfan.com/club/old_showbbs.asp?id=96548
作者:qq590240
#include <iostream>
#include <stdlib.h>

#ifdef _WIN32
using namespace std;
#endif

static void hanoi(int height)
{
??? int fromPole, toPole, Disk;
??? int *BitStr = new int[height],
??????? *Hold?? = new int[height];
??? char Place[]? = {'A', 'B', 'C'};
??? int i, j, temp;

??? for (i=0; i < height; i++)
??? {
??????? BitStr[i] = 0;
??????? Hold[i] = 1;
??? }
??? temp = 3 - (height % 2);
??? int TotalMoves = (1 << height) - 1;
??? for (i=1; i <= TotalMoves; i++)
??? {
??????? for (j=0 ; BitStr[j] != 0; j++)
??????? {
??????????? BitStr[j] = 0;
??????? }
??????? BitStr[j] = 1;
??????? Disk = j+1;
??????? if (Disk == 1)
??????? {
??????????? fromPole = Hold[0];
??????????? toPole = 6 - fromPole - temp;
??????????? temp = fromPole;
??????? }
??????? else
??????? {
??????????? fromPole = Hold[Disk-1];
??????????? toPole = 6 - Hold[0] - Hold[Disk-1];
??????? }
??????? cout << "Move disk " << Disk << " from " << Place[fromPole-1]
???????????? << " to " << Place[toPole-1] << endl;
??????? Hold[Disk-1] = toPole;
??? }
}

?


int main(int argc, char *argv[])
{
??? cout << "Towers of Hanoi: " << endl
???????? << "moving a tower of n disks from pole A to pole B by using pole C" << endl;
??? cout << "Input the height of the original tower: ";
??? int height;
??? cin >> height;
??? hanoi(height);

??? system("PAUSE");
??? return EXIT_SUCCESS;
}
?////////////////////////////////////////////////////////////
?我在這里根據《數學營養菜》(談祥柏 著)提供的一種方法,編了一個程序來實現。
*/
/*
算法介紹:
首先容易證明,當盤子的個數為n時,移動的次數應等于2^n - 1。
一位美國學者發現一種出人意料的方法,只要輪流進行兩步操作就可以了。
首先把三根柱子按順序排成品字型,把所有的圓盤按從大到小的順序放在柱子A上。
根據圓盤的數量確定柱子的排放順序:若n為偶數,按順時針方向依次擺放 A B C;
若n為奇數,按順時針方向依次擺放 A C B。
(1)按順時針方向把圓盤1從現在的柱子移動到下一根柱子,即當n為偶數時,若圓盤1在柱子A,則把它移動到B;
若圓盤1在柱子B,則把它移動到C;若圓盤1在柱子C,則把它移動到A。
(2)接著,把另外兩根柱子上可以移動的圓盤移動到新的柱子上。
即把非空柱子上的圓盤移動到空柱子上,當兩根柱子都非空時,移動較小的圓盤
這一步沒有明確規定移動哪個圓盤,你可能以為會有多種可能性,其實不然,可實施的行動是唯一的。
(3)反復進行(1)(2)操作,最后就能按規定完成漢諾塔的移動。
*/
#include <iostream>
using namespace std;

const int MAX = 64; //圓盤的個數最多為64

struct st{? //用來表示每根柱子的信息
????? int s[MAX]; //柱子上的圓盤存儲情況
????? int top; //棧頂,用來最上面的圓盤
????? char name; //柱子的名字,可以是A,B,C中的一個
?????
????? int Top()//取棧頂元素
????? {
??????????? return s[top];
????? }
????? int Pop()//出棧
????? {
??????????? return s[top--];
????? }
????? void Push(int x)//入棧
????? {
??????????? s[++top] = x;
????? }
} ;

long Pow(int x, int y); //計算x^y
void Creat(st ta[], int n); //給結構數組設置初值
void Hannuota(st ta[], long max); //移動漢諾塔的主要函數

int main(void)
{
????? int n;
????? cin >> n; //輸入圓盤的個數
?????
????? st ta[3]; //三根柱子的信息用結構數組存儲
????? Creat(ta, n); //給結構數組設置初值

????? long max = Pow(2, n) - 1;//動的次數應等于2^n - 1
????? Hannuota(ta, max);//移動漢諾塔的主要函數

????? system("pause");
????? return 0;
}

void Creat(st ta[], int n)
{
????? ta[0].name = 'A';
????? ta[0].top = n-1;
????? for (int i=0; i<n; i++) //把所有的圓盤按從大到小的順序放在柱子A上
??????????? ta[0].s[i] = n - i;
???????????
????? ta[1].top = ta[2].top = 0;//柱子B,C上開始沒有沒有圓盤
????? for (int i=0; i<n; i++)
??????????? ta[1].s[i] = ta[2].s[i] = 0;
???????????
????? if (n%2 == 0) //若n為偶數,按順時針方向依次擺放 A B C
????? {
??????????? ta[1].name = 'B';
??????????? ta[2].name = 'C';
????? }
????? else? //若n為奇數,按順時針方向依次擺放 A C B
????? {
??????????? ta[1].name = 'C';
??????????? ta[2].name = 'B';
????? }
}

long Pow(int x, int y)
{
????? long sum = 1;
????? for (int i=0; i<y; i++)
??????????? sum *= x;

????? return sum;
}

void Hannuota(st ta[], long max)
{
????? int k = 0; //累計移動的次數
????? int i = 0;
????? int ch;
????? while (k < max)
????? {
??????????? //按順時針方向把圓盤1從現在的柱子移動到下一根柱子
??????????? ch = ta[i%3].Pop();
??????????? ta[(i+1)%3].Push(ch);
??????????? cout << ++k << ": " << "Move disk " << ch << " from " << ta[i%3].name << " to " << ta[(i+1)%3].name << endl;
??????????? i++;
??????????? //把另外兩根柱子上可以移動的圓盤移動到新的柱子上
??????????? if (k < max)
??????????? {???? //把非空柱子上的圓盤移動到空柱子上,當兩根柱子都為空時,移動較小的圓盤
????????????????? if (ta[(i+1)%3].Top() == 0 || ta[(i-1)%3].Top() > 0 && ta[(i+1)%3].Top() > ta[(i-1)%3].Top())
????????????????? {
??????????????????????? ch =? ta[(i-1)%3].Pop();
??????????????????????? ta[(i+1)%3].Push(ch);
??????????????????????? cout << ++k << ": " << "Move disk " << ch << " from " << ta[(i-1)%3].name << " to " << ta[(i+1)%3].name << endl;
????????????????? }
????????????????? else
????????????????? {
??????????????????????? ch =? ta[(i+1)%3].Pop();
??????????????????????? ta[(i-1)%3].Push(ch);
??????????????????????? cout << ++k << ": " << "Move disk " << ch << " from " << ta[(i+1)%3].name << " to " << ta[(i-1)%3].name << endl;
????????????????? }
??????????? }
????? }
}

?

Posted on 2006-06-07 18:00 夢想飛揚 閱讀(6640) 評論(4)  編輯 收藏 引用

Feedback

# re: 漢諾塔非遞歸算法  回復  更多評論   

2006-06-11 18:31 by glacjay
嗯,以前在哪本數學書上看到過。

# re: 漢諾塔非遞歸算法  回復  更多評論   

2006-06-12 11:00 by Jacky
更正一下,在移動步驟(2)中,應該是當兩個柱子都非空的時候才移動較小的圓盤。

# re: 漢諾塔非遞歸算法  回復  更多評論   

2007-09-20 15:06 by mfkxowvfp
能給出具體的理論驗證嗎?

# re: 漢諾塔非遞歸算法  回復  更多評論   

2007-11-07 12:45 by 壽桃用戶入境
疆景頗產

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            美女在线一区二区| 亚洲电影天堂av| 亚洲色图制服丝袜| 国产精品夫妻自拍| 亚洲免费一在线| 亚洲自拍偷拍福利| 国产亚洲欧美日韩一区二区| 久久精品久久综合| 久久久久久久久久码影片| 亚洲大片av| 日韩亚洲欧美成人一区| 国产精品成人观看视频国产奇米| 亚洲欧美视频| 久久久青草青青国产亚洲免观| 亚洲国产精品999| 亚洲精选视频免费看| 国产精品一区二区在线| 久久这里只有精品视频首页| 女女同性精品视频| 亚洲线精品一区二区三区八戒| 亚洲欧美一区二区原创| 在线观看日产精品| 亚洲免费成人av| 极品日韩av| 99综合精品| 狠狠色综合网| 日韩一级视频免费观看在线| 国产亚洲欧美激情| 亚洲欧洲中文日韩久久av乱码| 国产精品麻豆成人av电影艾秋| 久久综合一区二区| 欧美日韩中文字幕| 欧美成年人视频网站欧美| 欧美视频中文一区二区三区在线观看| 久久成人综合网| 欧美日韩美女一区二区| 久久免费精品视频| 国产精品黄色在线观看| 欧美成人四级电影| 国产欧美日韩精品在线| 亚洲另类自拍| 亚洲精品乱码久久久久久按摩观| 午夜精品成人在线| 亚洲一区二区三区免费在线观看| 久久综合精品国产一区二区三区| 亚洲综合清纯丝袜自拍| 欧美高清不卡在线| 媚黑女一区二区| 国产日韩欧美综合精品| 99在线精品免费视频九九视| 亚洲第一成人在线| 久久精品99国产精品日本| 亚洲欧美视频| 国产精品国产三级国产普通话三级| 欧美成人精品一区二区| 国产无一区二区| 亚洲综合清纯丝袜自拍| 中文在线一区| 欧美日本国产一区| 亚洲国产另类久久久精品极度| 韩国在线一区| 久久狠狠婷婷| 免费人成精品欧美精品| 狠狠久久五月精品中文字幕| 亚洲欧美国产另类| 欧美在线日韩精品| 国产日韩一区在线| 久久国产精品久久久久久电车| 欧美综合激情网| 国产手机视频一区二区| 午夜在线一区二区| 久久久久久久国产| 一区二区三区在线免费视频| 久久久久久久久一区二区| 久久综合狠狠综合久久激情| 激情综合亚洲| 欧美va天堂va视频va在线| 亚洲国产精品电影| 中文在线不卡| 国产欧美日韩综合一区在线播放| 亚洲欧美不卡| 久久夜色精品国产欧美乱| 亚洲福利视频免费观看| 欧美大片免费久久精品三p| 亚洲欧洲日韩综合二区| 亚洲综合不卡| 国产综合第一页| 麻豆91精品91久久久的内涵| 亚洲国语精品自产拍在线观看| 99在线精品观看| 国产欧美精品| 蜜桃久久av一区| 中日韩在线视频| 久久综合九色欧美综合狠狠| 亚洲精品乱码久久久久久蜜桃麻豆 | 亚洲区国产区| 欧美日韩午夜在线| 欧美一区免费| 亚洲人妖在线| 久久久综合视频| 99精品视频免费| 国产日韩视频一区二区三区| 免费一级欧美在线大片| 一区二区免费在线观看| 老鸭窝毛片一区二区三区| 日韩一级在线| 一区二区在线视频| 欧美深夜福利| 免费欧美电影| 亚洲欧美日韩精品综合在线观看| 欧美成人免费在线视频| 羞羞视频在线观看欧美| 91久久夜色精品国产九色| 国产欧美视频一区二区三区| 老司机免费视频一区二区三区| 一区二区三区免费观看| 欧美va亚洲va国产综合| 欧美一区二视频| 一区二区三区久久| 亚洲国产天堂网精品网站| 国产精品一区二区三区成人| 欧美精品福利在线| 久久一区欧美| 久久精品99无色码中文字幕| 中文欧美字幕免费| 亚洲精品乱码久久久久久日本蜜臀| 久久综合电影一区| 欧美综合国产| 午夜精品剧场| 亚洲欧美国产日韩天堂区| 999在线观看精品免费不卡网站| 精品69视频一区二区三区| 国产日韩在线看片| 国产精品一区二区在线观看| 欧美日韩视频在线一区二区观看视频| 免费不卡在线视频| 久久中文在线| 久久综合九九| 六十路精品视频| 麻豆91精品91久久久的内涵| 久久精品成人| 久久综合电影| 毛片精品免费在线观看| 久久亚洲一区| 欧美二区在线播放| 欧美精品乱码久久久久久按摩| 免费在线观看成人av| 欧美顶级艳妇交换群宴| 欧美成人一区二区三区| 欧美 日韩 国产一区二区在线视频| 久久久97精品| 久久综合九色综合欧美狠狠| 久久亚洲国产精品日日av夜夜| 久久久综合香蕉尹人综合网| 久久资源在线| 欧美黄色一区二区| 欧美午夜精品| 国产欧美一区二区三区在线看蜜臀 | 亚洲欧洲日本一区二区三区| 亚洲国产欧美国产综合一区| 91久久国产综合久久| 99精品99久久久久久宅男| 一区二区三区回区在观看免费视频| 在线视频欧美精品| 欧美一区二区视频在线观看2020 | 日韩一区二区久久| 亚洲欧美日韩国产另类专区| 午夜亚洲性色福利视频| 久久午夜电影| 欧美日本三区| 国产主播一区二区三区| 亚洲国产精品一区二区www在线| av成人黄色| 久久国产手机看片| 亚洲国产美女久久久久| 亚洲视频导航| 蜜桃av久久久亚洲精品| 国产精品伦子伦免费视频| 一区二区亚洲精品国产| 国产精品99久久99久久久二8| 欧美伊人久久| 亚洲国产日韩在线| 午夜电影亚洲| 欧美精品一区二区精品网| 国产伦精品一区二区三区| 亚洲欧洲日韩女同| 欧美综合二区| 日韩小视频在线观看| 久久香蕉国产线看观看网| 国产精品久久久久7777婷婷| 亚洲福利精品| 久久精品人人做人人爽电影蜜月| 亚洲国产一区二区三区高清| 午夜视频在线观看一区| 欧美日韩国产免费观看| 狠狠色狠狠色综合系列| 欧美一区视频| 一区二区三区|亚洲午夜| 免费成人黄色av| 国内精品久久久久影院薰衣草|