WWWDOT-GOOGLE=DOTCOM

WWWDOT-GOOGLE=DOTCOM,

最終結果:

777589-188103=589486
777589-188106=589483

 

package com.wang.chars;

import java.util.Map;

import com.google.common.collect.Maps;

import lombok.Data;

public class SecretSum {

    @Data
    static class CharObj {

        private Character character;
        private boolean used;
        private int value;
    }

    public static void main(String[] args) {
        String[] parameters = { "wwwdot", "google", "dotcom" };
        // 對於每一個字符使用每一個數據
        Map<Character, CharObj> charObjs = Maps.newHashMap();
        // 進行字符初始化
        init(parameters, charObjs);

        // 對於每一個字符應用每一個數字
        Character[] characters = {};
        characters = charObjs.keySet().toArray(characters);

        applyNumber(charObjs, characters, 0, parameters);
    }

    private static void applyNumber(Map<Character, CharObj> charObjs, Character[] characters, int index, String[] parameters) {
        if (index == characters.length) {
            applyCalculation(charObjs, parameters);
            return;
        }
        CharObj charObj = charObjs.get(characters[index]);
        for (int i = 0; i < 10; i++) {
            if (isValidNumber(i, charObjs, characters, index)) {
                charObj.setValue(i);
                charObj.setUsed(true);
                applyNumber(charObjs, characters, index + 1, parameters);
            }
        }
    }

    private static void applyCalculation(Map<Character, CharObj> charObjs, String[] parameters) {
        Integer number[] = { 0, 0, 0 };
        number[0] = getNumber(charObjs, parameters[0]);
        number[1] = getNumber(charObjs, parameters[1]);
        number[2] = getNumber(charObjs, parameters[2]);
        if (number[0] - number[1] == number[2]) {
            System.out.println(number[0] + "-" + number[1] + "=" + number[2]);
        }
    }

    private static Integer getNumber(Map<Character, CharObj> charObjs, String string) {
        char[] characters = string.toCharArray();
        Integer number = 0;
        for (int i = 0; i < characters.length; i++) {
            number = number * 10 + charObjs.get(characters[i]).getValue();
        }
        return number;
    }

    // 不能使用前面已經使用過的字符
    private static boolean isValidNumber(int i, Map<Character, CharObj> charObjs, Character[] characters, int index) {
        for (int j = 0; j < index; j++) {
            CharObj charObj = charObjs.get(characters[j]);
            if (charObj.getValue() == i) {
                return false;
            }
        }
        return true;
    }

    private static void init(String[] parameters, Map<Character, CharObj> charObjs) {
        for (String parameter : parameters) {
            for (Character character : parameter.toCharArray()) {
                if (!charObjs.containsKey(character)) {
                    CharObj charObj = new CharObj();
                    charObj.setCharacter(character);
                    charObj.setUsed(false);
                    charObj.setValue(-1);
                    charObjs.put(character, charObj);
                }
            }
        }
    }
}

 

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