下の図での1〜15までの自然数の組み合わせを求めます。
![]()
public final class budou2{
//スタックで使うデータ
class StackDataDef {
int ptr;
int[] ValList;
StackDataDef(){
this.ptr = 0;
this.ValList = new int[15];
}
};
//スタック
class StackClass {
int stackP;
StackDataDef stackData[];
StackClass(){
stackP = 0;
stackData = new StackDataDef[99999];
}
private void push(StackDataDef pushData){
stackData[stackP++] = pushData;
//System.out.println("push" + pushData.ptr + "," + pushData.ValList[pushData.ptr]);
}
private StackDataDef pop(){
//System.out.println("pop");
return stackData[--stackP];
}
boolean isEmpty(){ return stackP == 0; }
}
public static void main(String[] args) {
budou2 mi = new budou2();
mi.main();
}
void main() {
StackClass st = new StackClass();
for (int i=1;i<=15;i++){ //Start With句
StackDataDef willPush = new StackDataDef();
willPush.ValList[0] = i;
st.push(willPush);
}
while (st.isEmpty() == false){
StackDataDef priInfo = st.pop();
for (int i=1;i<=15;i++){
boolean connBy = true;
for (int J=0;J<= priInfo.ptr;J++)
if (priInfo.ValList[J] == i) connBy = false;
if (priInfo.ptr == 4)
if (Math.abs(priInfo.ValList[0]-priInfo.ValList[1]) != i) connBy = false;
if (priInfo.ptr == 5)
if (Math.abs(priInfo.ValList[1]-priInfo.ValList[2]) != i) connBy = false;
if (priInfo.ptr == 6)
if (Math.abs(priInfo.ValList[2]-priInfo.ValList[3]) != i) connBy = false;
if (priInfo.ptr == 7)
if (Math.abs(priInfo.ValList[3]-priInfo.ValList[4]) != i) connBy = false;
if (priInfo.ptr == 8)
if (Math.abs(priInfo.ValList[5]-priInfo.ValList[6]) != i) connBy = false;
if (priInfo.ptr == 9)
if (Math.abs(priInfo.ValList[6]-priInfo.ValList[7]) != i) connBy = false;
if (priInfo.ptr == 10)
if (Math.abs(priInfo.ValList[7]-priInfo.ValList[8]) != i) connBy = false;
if (priInfo.ptr == 11)
if (Math.abs(priInfo.ValList[9]-priInfo.ValList[10]) != i) connBy = false;
if (priInfo.ptr == 12)
if (Math.abs(priInfo.ValList[10]-priInfo.ValList[11]) != i) connBy = false;
if (priInfo.ptr == 13)
if (Math.abs(priInfo.ValList[12]-priInfo.ValList[13]) != i) connBy = false;
if (connBy){ //connect by句
StackDataDef willPush = new StackDataDef();
willPush.ptr = priInfo.ptr+1;
for (int WK=0;WK <= 14;WK++)
willPush.ValList[WK] = priInfo.ValList[WK];
willPush.ValList[willPush.ptr] = i;
st.push(willPush);
}
}
//合格経路なら表示
if (priInfo.ptr==14){
String willOut ="";
for (int WK=0;WK <= 14;WK++)
willOut += Integer.toString(priInfo.ValList[WK]) + ",";
System.out.println(willOut);
}
}
}
}
13,3,15,14,6,10,12,1,8,2,11,7,9,4,5, 6,14,15,3,13,8,1,12,10,7,11,2,4,9,5,