当前位置:编程学习 > C/C++ >>

每天一算法(河内之塔),想起来就复习了下下

如果柱子标为ABC,要由A搬至C,在只有一个盘子时,就将它直接搬至C,当有两个盘子,就将B当作辅助柱。如果盘数超过2个,将第三个以下的盘子遮起来,就很简单了,每次处理两个盘子,也就是:A->B、A ->C、B->C这三个步骤,而被遮住的部份,其实就是进入程式的递回处理。事实上,若有n个盘子,则移动完毕所需之次数为2^n - 1。


#include <iostream>
#include <cmath>
#include <ctime>
using namespace std;
// 使用RAND_MAX

void hanni(int n,char A,char B,char C)
{
 if (n <0)
 {
  cout<<"n<0"<<endl;
  exit(0);
 }
 else
 {
  if (1 == n)
  {
   printf("从%c移动%d个到%c",A,n,C);
   cout<<endl;
  }
  else
  {
   hanni(n-1,A,C,B);
   hanni(1,A,B,C);
   hanni(n-1,B,A,C);
  }
 }
};
int main(){
 char A = 'a';
 char B = 'b';
 char C = 'c';
 hanni(3,A,B,C);
 return 0;
}


 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,