返回移动次数 hanoi 片数 1<=n<=64
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n;
int i;
//unsigned __int64 hanoi=0xffffffffffffffff;
unsigned __int64 hanoi=1;
scanf("%d", &n);
if(n<64)
{
for(i=1;i<=n;i++) hanoi*=2;
printf("%I64u",hanoi-1);
}
if(n==64)
{
hanoi=0xffffffffffffffff;
printf("%I64u",hanoi);
}
return 0;
}
汉诺塔 非递归算法
#include <stack>
#include <iostream>
using namespace std;
void Hanoi(int n, int from, int to)
{
stack <int> s;
int other = 0;
s.push(n);
s.push(from);
s.push(to);
while(s.empty() != true)
{
to = s.top(); s.pop();
from = s.top(); s.pop();
n = s.top(); s.pop();
other = 6 - from - to;
if(n== 1)
{
printf("%d->%d,", from, to);
}
else
{
s.push(n-1);
s.push(other);
s.push(to);
s.push(1);
s.push(from);
s.push(to);
s.push(n-1);
s.push(from);
s.push(other);
}
}
}
int main()
{
Hanoi(4,1,3);
return 0;
}