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