c++ - 汉诺塔问题

标签 c++

大家好,我在汉诺塔上遇到了一个问题:
我们得到一堆交替堆叠的不同颜色的圆柱体。任务是将两堆相同颜色的圆柱体分开
我可以使用递归为普通的汉诺塔编写代码(算法),但我无法弄清楚这部分。有人可以帮忙吗?
正则汉诺问题代码:

#include<iostream>

using namespace std;
int count=0;

void hanoi(char a,char b,char c,int x)
{
  if(x>1)
  {
    hanoi(a,c,b,x-1);
    hanoi(a,b,c,1);
    hanoi(c,b,a,x-1);
  }
  else
  {
    cout<<"Move a Disk from "<<a<<" to "<<b<<endl; count++;  
  }
}

int main()
{
  int n;
  cout<<"Enter the height of stack";
  cin>>n;
  hanoi('A','B','C',n);
  cout<<"\nNo. of changes done:"<<count;

  return 0;
}

最佳答案

解决问题 n 次,交替使用您留下解决方案的钉子。

int main()
{
    int n;
    cout<<"Enter the height of stack";
    cin>>n;

    char startPeg = 'A';
    char interPeg = 'B';
    char slnPeg = 'C';

    while(n > 0) {
        hanoi(startPeg,interPeg,slnPeg,n);
        n--;
        char temp = startPeg;
        startPeg = slnPeg;
        slnPeg = temp;
    }

    return 0;
}

这是它的工作原理。假设我们的堆栈有 Red(R) 和 Yellow(Y) 两种颜色,并且有 5 个单位高:

     |           |           |
    Y|Y          |           |
   RR|RR         |           |
  YYY|YYY        |           |
 RRRR|RRRR       |           |
YYYYY|YYYYY      |           |     

第一次运行后,它看起来像这样:

     |           |           |
     |           |          Y|Y    
     |           |         RR|RR
     |           |        YYY|YYY
     |           |       RRRR|RRRR
     |           |      YYYYY|YYYYY

第二次运行后,它看起来像这样:

     |           |           |    
    Y|Y          |           |
   RR|RR         |           |
  YYY|YYY        |           |
 RRRR|RRRR       |      YYYYY|YYYYY

第三次运行后,它看起来像这样:

     |           |           |    
     |           |          Y|Y
     |           |         RR|RR
     |           |        YYY|YYY
 RRRR|RRRR       |      YYYYY|YYYYY

在第四次运行之后,这个:

     |           |           |    
     |           |           |
    Y|Y          |           |
   RR|RR         |        YYY|YYY
 RRRR|RRRR       |      YYYYY|YYYYY

在第五次也是最后一次运行之后,这是:

     |           |           |    
     |           |           |
     |           |          Y|Y
   RR|RR         |        YYY|YYY
 RRRR|RRRR       |      YYYYY|YYYYY

至此,大功告成。

如果你迫切需要递归,这样做:

void painful(char start, char inter, char sln, int n) {
    if(n == 0) return;
    hanoi(start,inter,sln);
    painful(sln,inter,start,n-1);
}

int main()
{
    int n;
    cout<<"Enter the height of stack";
    cin>>n;

    painful('A','B','C',n);

    return 0;
}

关于c++ - 汉诺塔问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5796023/

相关文章:

c++ - C++ 事实上支持的条件随机字段包是什么?

c++ - 在没有模板变量的情况下启动模板化类

c++ - 疯狂计算器

C++ 内联汇编 PROC ENDP 错误

c++ - 模式名称/写得好吗?

c++ - 如何在 C++ 的循环中从 vector 中删除元素

c++ - 从 std::function::target<>() 获取的函数指针和普通函数指针有什么区别?

c++ - 如果我有两个具有完全相同成员但名称不同的结构/类,是否有任何简单的方法可以将一个转换为另一个?

c++ - 如何为成员函数创建一个可简单复制的委托(delegate)

c++ - 有没有办法在平均值中不包含负数,当输入负数时你如何终止程序?