递归问题

来源:互联网 发布:淘宝国外代购是真的吗 编辑:程序博客网 时间:2024/06/11 05:01

1、汉诺塔问题

问题描述:1,2,...,n表示n个盘子.数字大盘子就大.n个盘子放在第1根柱子上.大盘不能放在小盘上.在第1根柱子上的盘子是a[1],a[2],...,a[n]. a[1]=n,a[2]=n-1,...,a[n]=1.即a[1]是最下面的盘子.把n个盘子移动到第3根柱子.每次只能移动1个盘子,且大盘不能放在小盘上.问第m次移动的是哪一个盘子,从哪根柱子移到哪根柱子.例如:n=3,m=2. 回答是 :2 1 2,即移动的是2号盘,从第1根柱子移动到第2根柱子 。Input第1行是整数T,表示有T组数据,下面有T行,每行2个整数n (1 ≤ n ≤ 63) ,m≤ 2^n-1 Output输出第m次移动的盘子号数和柱子的号数。

例如:Input:n=3,m=2;Output:2  1  2

            Input:n=4,m=5;Output:1  3   1

#include <iostream>
using namespace std;
#define MAXCHAR 256
void hanoi(int n,int m,char one,char two,char three,char *output)
{
       static int count=0;
       if(n==1)
      {
           count++;
           if(count==m)
            {
              output[0]=one;
              output[1]=three;
              output[2]='1';
             }
        }
     else
     {
          hanoi(n-1,m,one,three,two,output);
          count++;
          if(count==m)
          {
              output[0]=one;
              output[1]=three;
              itoa(n,output+2,10);
            }
          hanoi(n-1,m,two,one,three,output);
      }
}

int main()
{
        int n=3,m=2;
        char output[MAXCHAR]={0};
        hanoi(n,m,'1','2','3',output);
        cout<<output+2<<" "<<output[0]<<" "<<output[1]<<endl;
        system("pause");
        return 0;
}

原创粉丝点击