古堡探險(藍橋杯)

福爾摩斯到某古堡探險,看到門上寫着一個奇怪的算式:

     ABCDE * ? = EDCBA

    他對華生說:“ABCDE應該代表不同的數字,問號也代表某個數字!”

    華生:“我猜也是!”

    於是,兩人沉默了好久,還是沒有算出合適的結果來。

    請你利用計算機的優勢,找到破解的答案。

    把 ABCDE 所代表的數字寫出來。

解析:ABCDE代表不同的數字,問號也代表某個數字,所以說ABCDE和?分別都是來自數字0~9的數字,可以用全排列的算法

代碼如下:(耗時20ms左右)

public class 古堡探險
{
	private static long Begin;    //與本題無關,只是用來計算耗時的
	private static long Last;     //與本題無關,只是用來計算耗時的
	
	public static int GetNum1(int[] c,int x,int y)   //計算ABCDE五位數字組成的一位數字
	{
		int sum = 0;
		for(int i=x;i<=y;++i)
		{
			sum = sum*10 + c[i];
		}
		return sum;
	}
	
	public static int GetNum2(int[] c,int x,int y)  //計算EDCBA五位數字組成的一位數字
	{
		int sum = 0;
		for(int i=x;i>=y;--i)
		{
			sum = sum*10+c[i];
		}
		return sum;
	}
	
	public static void Swap(int[] c,int i,int j)
	{
		int tmp = c[i];
		c[i] = c[j];
		c[j] = tmp;
	}
	
	public static void AllPermutation(int[] c,int start)  //全排列算法
	{
		if(start==c.length-1)
		{
			int A = GetNum1(c,0,4);    //用前五位數代表ABCDE
			int B = c[5];              //代表?
			int C = GetNum2(c,4,0);    //用前五位數的逆序代表EDCBA
			if(A*B==C)
			{
				Last = System.currentTimeMillis()- Begin;   //與本題無關,只是用來計算耗時的
				System.out.println(A);   //輸出ABCDE
				System.out.println("耗時:"+Last+"ms");      //與本題無關,只是用來計算耗時的
				System.exit(0);         //退出Java虛擬機
			}
		}
		else
		{
			for(int i=start,t=c.length;i<t;++i)
			{
				Swap(c,i,start);
				AllPermutation(c,start+1);
				Swap(c,start,i);
			}
		}
	}

	public static void main(String[] args)
	{
		Begin = System.currentTimeMillis();   //與本題無關,只是用來計算耗時的
		int[] c = {0,1,2,3,4,5,6,7,8,9};    //全排列算法
		AllPermutation(c,0);
	}
}

運行結果:

21978
耗時:16ms

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章