三羊獻瑞(藍橋杯)

觀察下面的加法算式:

       祥瑞生輝

  +   三羊獻瑞

----------------------

    三羊生瑞氣

(如果有對齊問題,可以參看【圖1.jpg】)

其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。

請你填寫“三羊獻瑞”所代表的4位數字(答案唯一),不要填寫任何多餘內容。

答案:1 0 8 5

解析:這個題看起來有點嚇人,但是隻要認真審題,做起來就沒有那麼難了,祥瑞生輝代表四個數字組成的一個整數,三羊獻瑞代表四個數字組成的一個整數,並且不同的漢字代表不同的數字,祥瑞生輝和三羊獻瑞共有一個字(數字)是相同的,四位數+四位數生成了一個五位數,說明三一定是進位1,所以可以確定的是三一定是1,羊、生、瑞、氣都是兩個加數裏面的數,所以這個題不用暴力破解也能解決,可以用全排列的方法來做。先定義一個int類型的數組(c[10]),數組c的初始化方式爲:

上圖中的數字是數組的下標所對應的漢字(及數字),根據上圖下標初始化數組c = {1,0,2,3,4,5,6,7,8,9},c[0]最好等於1,這樣可以減少時間複雜度,然後進行全排列的算法,以1開頭(即c[0]=1)先把c[5]記錄下來(即int=c[5]),根據題目要有瑞字有兩個,所以讓c[5] = c[3],然後計算祥瑞生輝、三羊獻瑞、三羊生瑞氣若組成的三個數:

int A = c[0]*1000+c[1]*100+c[2]*10+c[3];

int B = c[4]*1000+c[5]*100+c[6]*10+c[7];

int C = c[0]*10000+c[1]*1000+c[6]*100+c[3]*10+c[8];

若A+B=C則輸出c[0],c[1],c[2],c[3]。

代碼如下:

public class 三羊獻瑞
{
	
	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)
		{
			if(c[0]==1)    //因爲羊一定代表1,所以只需判斷以1開頭的排列即可
			{
				int tmp = c[5];  //先記錄下c[5],因爲全排列中的數字必須是分別且只出現一次
				c[5] = c[3];     //應爲有兩個瑞字,所以有兩個重複數字
				int A = c[0]*1000+c[1]*100+c[2]*10+c[3];   //三羊獻瑞
				int B = c[4]*1000+c[5]*100+c[6]*10+c[7];   //祥瑞生輝
				int C = c[0]*10000+c[1]*1000+c[6]*100+c[3]*10+c[8];   //三羊生瑞氣
				if(A+B==C)
				{
					System.out.println(c[0]+" "+c[1]+" "+c[2]+" "+c[3]); //輸出三羊獻瑞
					System.exit(0);       //退出虛擬機
				}
				c[5] = tmp;     //保證全排列數組中的數分別且只出現一次
			}
			else    //只判斷以1開頭,其他則不符合要求
			{
				System.exit(0);        //退出虛擬機
			}
		}
		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)
	{
		int[] c = {1,0,2,3,4,5,6,7,8,9};     //1代表羊
		AllPermutation(c,0);    //全排列算法
	}
}

運行結果:

1 0 8 5

 

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