汉诺塔问题


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

   }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值