連なった円の中に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,