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