1. 程式人生 > 其它 >第六屆藍橋杯大賽省賽真題-填空題-三羊獻瑞(Java實現)

第六屆藍橋杯大賽省賽真題-填空題-三羊獻瑞(Java實現)

技術標籤:java藍橋杯

三羊獻瑞

觀察下面的加法算式:

      祥 瑞 生 輝
  +   三 羊 獻 瑞
-------------------
   三 羊 生 瑞 氣
   
(如果有對齊問題,可以參看【圖1.jpg】)
其中,相同的漢字代表相同的數字,不同的漢字代表不同的數字。
請你填寫“三羊獻瑞”所代表的4位數字(答案唯一),不要填寫任何多餘內容。

在這裡插入圖片描述

【解析】

這是一道無重複的組合並排序的題目!!!
解決方法:一種是暴力列舉,另一種是遞歸回溯
填空題直接用暴力列舉就行了,這題和第四屆藍橋杯省賽真題-填空題-馬虎的算式(Java實現)是一樣的題型

方法一:暴力列舉

package 第六屆省賽;

public class _3三羊獻瑞 {
	public static void main(String[] args) {
		for(int a=0;a<=9;a++) {
			for(int b=0;b<=9;b++) {
				for(int c=0;c<=9;c++) {
					for(int d=0;d<=9;d++) {
						for(int e=0;e<=9;e++) {
							for(int f=0;f<=9;f++) {
								for(int g=0;g<=9;g++) {
									for
(int i=0;i<=9;i++) { if(b!=a&&c!=b&&c!=a&& d!=c&&d!=b&&d!=a&& e!=d&&e!=c&&e!=b&&e!=a&& f!=e&&f!=d&&f!=c&&f!=b&&f!=a&& g!=
f&&g!=e&&g!=d&&g!=c&&g!=b&&g!=a&& i!=g&&i!=f&&i!=e&&i!=d&&i!=c&&i!=b&&i!=a) { int x = a*1000+b*100+c*10+d; int y = e*1000+f*100+g*10+b; int z = e*10000+f*1000+c*100+b*10+i; if(x+y==z) { if(y/1000>0) //取四位的數字 System.out.println(y); } } } } } } } } } } } }

方法二:遞歸回溯

package 第六屆省賽;
/**
 * 遞歸回溯
 * @author wzc  
 * @date 2021年1月24日
 */
public class _3三羊獻瑞2 {
	public static void main(String[] args) {
		int a[] = new int[8];//abcdefgh一共8個未知數
		int[] b = new int[10];	//從b裡取數0-9
		for(int i=0; i<b.length; i++) {//填充b陣列
			b[i] = i;
		}
		
		//呼叫f()
		f(a,b,0);
	}

	private static void f(int[] a, int[] b, int i) {
		//結束條件
		if(i==a.length) {
			int x = a[0]*1000+a[1]*100+a[2]*10+a[3];
			int y = a[4]*1000+a[5]*100+a[6]*10+a[1];
			int z = a[4]*10000+a[5]*1000+a[2]*100+a[1]*10+a[7];
			if(x+y==z) {
				if(y/1000>0) 
					System.out.println(y);
			}
			return;
		}
		for(int j=0; j<b.length; j++) {
			if(b[j]!=-1) {
				a[i] = b[j];	//取數放進容器a裡
				b[j]=-1;	//已使用,標記-1
				f(a,b,i+1);
				b[j] = a[i];	//呼叫結束了,把容器a裡的數還回去
			}
		}
	}
}

結果

1085