汉诺塔问题

来源:互联网 发布:尤克里里在线调音软件 编辑:程序博客网 时间:2024/06/08 13:19


//汉诺塔问题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));   }}


原创粉丝点击