//汉诺塔问题
public class HanoiProblem{
//递归方法解决hanoi问题
public static void Hanoi(int n)
{
if(n>0)
{
fun(n,"left","mid","right");
}
}
public static void fun(int n,String from,String mid ,String to)
{
if(n==1)
{
System.out.println("Move form "+from+" to "+to);
}
else{
fun(n-1,from,to,mid);
fun(1,from,mid,to);
fun(n-1,mid,from,to);
}
}
//进阶问题(递归解法)
public static int step1(int[]arr)
{
if(arr==null||arr.length==0)
{
return -1;
}
return process(arr,arr.length-1,1,2,3);
}
public static int process(int[]arr,int i,int from ,int mid,int to)
{
if(i==-1)
{
return 0;
}
if(arr[i]!=from&&arr[i]!=to)
{
return -1; //中间位置不可能存在
}
if(arr[i]==from)
{
return process(arr,i-1,from,to,mid);
}
else
{
int rest=process(arr,i-1,mid,from,to);
if(rest==-1)
{
return -1;
}
return (1<<i)+rest;
}
}
//进阶问题(非递归解法)
public static int step2(int []arr)
{
if(arr==null||arr.length==0)
{
return -1;
}
int from=1;
int mid=2;
int to=3;
int i=arr.length-1;
int res=0;
int temp=0;
while(i>=0)
{
if(arr[i]!=from&&arr[i]!=to)
{
return -1;
}
if(arr[i]==to)
{
res+=1<<i;
temp=from;
from=mid;
}
else
{
temp=to;
to=mid;
}
mid=temp;
i--;
}
return res;
}
public static void main(String[]args)
{
int n=3;
Hanoi(n); //汉诺塔问题总共的移动次数2^n-1
int[]arr={3,3,2,1};
System.out.println(step1(arr));
System.out.println(step2(arr));
}
}