免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
用非遞歸算法解決Hanoi漢諾塔問題
●漢諾塔算法的非遞歸實(shí)現(xiàn)C++源代碼

#include <iostream>
using namespace std;

//圓盤的個(gè)數(shù)最多為64
const int MAX = 64;

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

long Pow(int x, int y); //計(jì)算x^y
void Creat(st ta[], int n); //給結(jié)構(gòu)數(shù)組設(shè)置初值
void Hannuota(st ta[], long max); //移動(dòng)漢諾塔的主要函數(shù)

int main(void)
{
      int n;
      cin >> n; //輸入圓盤的個(gè)數(shù)
      st ta[3]; //三根柱子的信息用結(jié)構(gòu)數(shù)組存儲(chǔ)
      Creat(ta, n); //給結(jié)構(gòu)數(shù)組設(shè)置初值

      long max = Pow(2, n) - 1;//動(dòng)的次數(shù)應(yīng)等于2^n - 1
      Hannuota(ta, max);//移動(dòng)漢諾塔的主要函數(shù)

      system(“pause”);
      return 0;
}

void Creat(st ta[], int n)
{
      ta[0].name = ‘A’;
      ta[0].top = n-1;
     //把所有的圓盤按從大到小的順序放在柱子A上
      for (int i=0; i<n; i++)
            ta[0].s = n - i;
      //柱子B,C上開始沒有沒有圓盤
      ta[1].top = ta[2].top = 0;
      for (int i=0; i<n; i++)
            ta[1].s = ta[2].s = 0;
     //若n為偶數(shù),按順時(shí)針方向依次擺放 A B C
      if (n%2 == 0)
      {
            ta[1].name = ‘B’;
            ta[2].name = ‘C’;
      }
      else  //若n為奇數(shù),按順時(shí)針方向依次擺放 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; //累計(jì)移動(dòng)的次數(shù)
  int i = 0;
  int ch;
  while (k < max)
  {
    //按順時(shí)針方向把圓盤1從現(xiàn)在的柱子移動(dòng)到下一根柱子
    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++;
   //把另外兩根柱子上可以移動(dòng)的圓盤移動(dòng)到新的柱子上
   if (k < max)
   {    

    //把非空柱子上的圓盤移動(dòng)到空柱子上,當(dāng)兩根柱子都為空時(shí),移動(dòng)較小的圓盤
    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;
    }
 }
}
}
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C|用遞歸和非遞歸方法求解漢諾塔問題
漢諾塔問題(三柱及四柱)詳解
漢諾塔的圖解遞歸算法
漢諾塔算法
Python|如何用遞歸解決漢諾塔問題?
新野縣機(jī)器人編程課程scratch圖解漢諾塔問題
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服