1. 程式人生 > >藍橋杯 湊算式的java實現

藍橋杯 湊算式的java實現

這個算式中A~I代表1~9的數字,不同的字母代表不同的數字。

比如:
6+8/3+952/714 就是一種解法,
5+3/1+972/486 是另一種解法。
這個算式一共有多少種解法?

注意:你提交應該是個整數,不要填寫任何多餘的內容或說明性文字。

演算法思想:將A-I所代表的數字進行全排列,然後進行檢檢視看是否符合等式。

資料域:

1.private static int[] visited;

主要是用來表示資料是否被訪問過(0表示資料尚未被訪問過,1表示資料已經被訪問過了)。

2.private static double[] save;

用來儲存資料。

3.private static int sum;
   用來計數,統計符合該等式的情況數。

方法:

1.資料的初始化

private static void init() {
        visited=new int[9];
        for(int i=0;i<9;i++) {
            visited[i]=0;//0表示尚未被訪問,1表示已經被訪問過了
        }
        save=new double[9];
    }

2.檢測是否滿足等式

private static boolean check() {
        double def=save[3]*100+save[4]*10+save[5];
        double ghi=save[6]*100+save[7]*10+save[8];
        double left=save[0]+save[1]/save[2]+def/ghi;
        if(left==10) {
            return true;
        }
        return false;
    }

3.進行深度搜索

private static void dfs(int step) {
        if(step>8) {
            if(check()==true) {
                sum++;
            }
            return;//注意return不可寫在if語句裡面
        }
        
        else {
            for(int i=1;i<10;i++) {
                if(visited[i-1]==0) {//當前的數字沒有被訪問
                    save[step]=i;
                    visited[i-1]=1;//設定當前數字狀態為已經被訪問過了
                    dfs(step+1);
                    visited[i-1]=0;//回溯
                }
            }
        }
    }

注意:儲存資料的元素型別應該是double型,而不應該是int型。

答案:29