题目
有三根相邻的柱子,标号为ABC,A柱子上按从小到大叠放着n个不同大小的盘子,要求把所有盘子每次移动一个,最终放到C柱子上;移动过程可以借助B柱子,但要求每次移动中必须保持小盘子在大盘子的上面。比如n=10,请给出最少次数的移动方案。
#include "stdafx.h"
#include <iostream>
void MoveOne(char from, char to)
{
std::cout<<from<<"->"<<to<<std::endl;
}
void Move(char from, char to, char aux, int n)
{
if (n == 1)
{
MoveOne(from, to);
return;
}
Move(from, aux, to, n - 1);
MoveOne(from, to);
Move(aux, to, from, n - 1);
}
int _tmain(int argc, _TCHAR* argv[])
{
int n = 3;
Move("A", "B", "C", n);
return 0;
}
汉诺塔的状态
给定从小到大的N个盘子,它们散乱的位于A、B、C柱上,问这一状态是否是将这N个盘子从A借助B移动到C的必经状态?如果是,返回时第几个状态,如果不是,返回-1。
初始状态记为0。
根据从小到大这N个盘子位于哪个柱子上,形成一个只能取A,B,C三种可能的字符串:如“ABCCABCA"