河内塔的问题

Tower of hanoi problem

本文关键字:问题 内塔      更新时间:2023-10-16

大家好,我在河内塔上遇到了一个问题:
我们有一堆不同颜色的圆柱体,它们交替地堆叠在一起。
工作是将两叠相同颜色的纸分开
我可以用递归写一个普通的河内塔的代码(算法),但我不能弄清楚这部分。有人能帮忙吗?
常规河内问题代码:

#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;
}

它是这样工作的。假设我们的堆栈的颜色是红色(R)和黄色(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;
}
#include <stdio.h>
hanoi(char a, char b, char c, int h) {
    if(h<=1){
        printf("move:%c to %c :n", a, b );
    }else{
        hanoi(a,c,b, h-1);
        hanoi(a,b,c, 1);
        hanoi(c,b,a, h-1);
    }
}
main(){
    int input;
    int i ;
    scanf("%d", &input);
    /* A is the src and B is dest */
    for(i=1; i< input ; i++){
        if(i%2){
            hanoi('A', 'B', 'C', input-i);
        }else{
            hanoi('B', 'A', 'C', input-i);
        }
    }
}
// work ?