連なった円の中に1から始まる、連続した自然数を入れていきます。 ただし、円の重なった部分には、その左右に入っている数の和を入れてください 円が8個の場合、1から15までの数を入れてみてください。![]()
public final class renjyu15{
class StackDataDef {
int[] ValList = new int[15];
}
//スタック
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<=14;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) {
renjyu15 mi = new renjyu15();
mi.main();
}
void main() {
StackClass st = new StackClass();
StackDataDef willPush = new StackDataDef();
int X=0;
for (int i=1;i<=15;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<=14;X++)
if (priInfo.ValList[X] == 0)
isOK = false;
if (isOK){
System.out.println("解" + Integer.toString(++ansCnt));
String willOut ="";
for(X=0;X<=14;X++)
willOut += priInfo.ValList[X] + ",";
System.out.println(willOut); willOut="";
continue;
}
X=0;
while(X!= 15 && priInfo.ValList[X] !=0) X++;
if (X==15){
st.push(priInfo);
continue;
}
for (int i=1;i<=15;i++){ //connect by句
priInfo.ValList[X] = i;
if (isValid(priInfo.ValList)) st.push(priInfo);
}
}
}
private boolean isValid(int[] ValList){
int[] counter = new int[16];
//ユニークチェック
for (int LoopX=0;LoopX<=14;LoopX++)
counter[ValList[LoopX]]++;
for (int i=1;i<=15;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;
if (ValList[8] != 0 && ValList[7] != ValList[6] + ValList[8])
return false;
if (ValList[10] != 0 && ValList[9] != ValList[8] + ValList[10])
return false;
if (ValList[12] != 0 && ValList[11] != ValList[10] + ValList[12])
return false;
if (ValList[14] != 0 && ValList[13] != ValList[12] + ValList[14])
return false;
return true;
}
}
解1 14,15,1,12,11,13,2,7,5,8,3,9,6,10,4, 解2 14,15,1,12,11,13,2,6,4,9,5,8,3,10,7, 解3 14,15,1,11,10,13,3,8,5,12,7,9,2,6,4, 以下略