トップページに戻る    次のJavaアルゴリズムパズルへ    前のJavaアルゴリズムパズルへ

3-3 連環の数 初級編

Javaアルゴリズムパズル

連なった円の中に1から始まる、連続した自然数を入れていきます。
ただし、円の重なった部分には、その左右に入っている数の和を入れてください

円が2つの場合は1から3の数が図のように入ります。


円が3つの場合は、1から5の数が、例えば図のように入ります。


円が4個の場合、1から7までの数を入れてみてください


ソース

public final class renjyu7{
    class StackDataDef {
        int[] ValList = new int[7];
    }

    //スタック
    class StackClass {
        int stackP;
        StackDataDef stackData[];

        StackClass(){
            stackP = 0;
            stackData = new StackDataDef[99999];
        }

        private void push(StackDataDef pushData){
            stackData[stackP] = new StackDataDef();

            for(int X=0;X<=6;X++)
                stackData[stackP].ValList[X] = pushData.ValList[X];
            stackP++;
        }

        private StackDataDef pop(){
            return stackData[--stackP];
        }
        boolean isEmpty(){ return stackP == 0; }
    }

    public static void main(String[] args) {
        renjyu7 mi = new renjyu7();
        mi.main();
    }

    void main() {
        StackClass st = new StackClass();

        StackDataDef willPush = new StackDataDef();

        int X=0;

        for (int i=1;i<=7;i++){ //Start With句
            willPush.ValList[X] = i;
            if (isValid(willPush.ValList)) st.push(willPush);
        }

        int ansCnt=0;
        while (st.isEmpty() == false){
            StackDataDef priInfo = st.pop();

            boolean isOK = true;
            //合格経路なら表示
            for (X=0;X<=6;X++)
                if (priInfo.ValList[X] == 0)
                    isOK = false;

            if (isOK){
                System.out.println("解" + Integer.toString(++ansCnt));
                String willOut ="";
                for(X=0;X<=6;X++)
                    willOut += priInfo.ValList[X] + ",";

                System.out.println(willOut); willOut="";
                continue;
            }

            X=0;

            while(X!= 7 && priInfo.ValList[X] !=0) X++;

            if (X==7){
                st.push(priInfo);
                continue;
            }

            for (int i=1;i<=7;i++){ //connect by句
                priInfo.ValList[X] = i;
                if (isValid(priInfo.ValList)) st.push(priInfo);
            }
        }
    }

    private boolean isValid(int[] ValList){
        int[] counter = new int[8];
        //ユニークチェック
        for (int LoopX=0;LoopX<=6;LoopX++)
            counter[ValList[LoopX]]++;
        for (int i=1;i<=7;i++)
            if (counter[i] >=2) return false;

        //和のチェック
        if (ValList[2] != 0 && ValList[1] != ValList[0] + ValList[2])
            return false;
        if (ValList[4] != 0 && ValList[3] != ValList[2] + ValList[4])
            return false;
        if (ValList[6] != 0 && ValList[5] != ValList[4] + ValList[6])
            return false;

        return true;
    }
}


実行結果

解1
6,7,1,4,3,5,2,
解2
3,4,1,6,5,7,2,
解3
2,7,5,6,1,4,3,
解4
2,5,3,4,1,7,6,