Eight queens puzzleを解きます。
public final class hatiouhi{
class StackDataDef {
int[][] ValList = new int[8][8];
}
//スタック
class StackClass {
int stackP;
StackDataDef stackData[];
StackClass(){
stackP = 0;
stackData = new StackDataDef[99999];
}
private void push(StackDataDef pushData){
stackData[stackP] = new StackDataDef();
for(int Y=0;Y<=7;Y++)
for(int X=0;X<=7;X++)
stackData[stackP].ValList[X][Y] = pushData.ValList[X][Y];
stackP++;
}
private StackDataDef pop(){
return stackData[--stackP];
}
boolean isEmpty(){ return stackP == 0; }
}
public static void main(String[] args) {
hatiouhi mi = new hatiouhi();
mi.main();
}
void main() {
StackClass st = new StackClass();
StackDataDef willPush = new StackDataDef();
int X;int Y;
for (Y=0;Y<=7;Y++){ //Start With句
willPush.ValList[0][Y] = 1;
st.push(willPush);
willPush.ValList[0][Y] = 0;
}
int ansCnt=0;
while (st.isEmpty() == false){
StackDataDef priInfo = st.pop();
int queenCnt = 0;
//合格経路なら表示
for (X=0;X<=7;X++)
for (Y=0;Y<=7;Y++)
if (priInfo.ValList[X][Y] == 1)
queenCnt++;
if (queenCnt == 8){
System.out.println("解" + Integer.toString(++ansCnt));
String willOut ="";
for(X=0;X<=7;X++){
for(Y=0;Y<=7;Y++){
willOut += priInfo.ValList[X][Y] + ",";
}
System.out.println(willOut); willOut="";
}
continue;
}
for (Y=0;Y<=7;Y++){ //connect by句
priInfo.ValList[queenCnt][Y] = 1;
if (isValid(priInfo.ValList,queenCnt,Y)){
st.push(priInfo);
}
priInfo.ValList[queenCnt][Y] = 0;
}
}
}
private boolean isValid(int[][] ValList,int X,int Y){
int counter = 0;int LoopX;int LoopY;
//横チェック
for (LoopX=0;LoopX<=X;LoopX++) counter+= ValList[LoopX][Y];
if (counter >=2) return false;
//左下チェック
counter = 0;
for (LoopX=X,LoopY=Y;
0 <= LoopX && LoopX <= 7 &&
0 <= LoopY && LoopY <= 7;
LoopX--,LoopY++) counter+= ValList[LoopX][LoopY];
if (counter >=2) return false;
//左上チェック
counter = 0;
for (LoopX=X,LoopY=Y;
0 <= LoopX && LoopX <= 7 &&
0 <= LoopY && LoopY <= 7;
LoopX--,LoopY--) counter+= ValList[LoopX][LoopY];
if (counter >=2) return false;
return true;
}
}
解1 0,0,0,0,0,0,0,1, 0,0,0,1,0,0,0,0, 1,0,0,0,0,0,0,0, 0,0,1,0,0,0,0,0, 0,0,0,0,0,1,0,0, 0,1,0,0,0,0,0,0, 0,0,0,0,0,0,1,0, 0,0,0,0,1,0,0,0, 解2 0,0,0,0,0,0,0,1, 0,0,1,0,0,0,0,0, 1,0,0,0,0,0,0,0, 0,0,0,0,0,1,0,0, 0,1,0,0,0,0,0,0, 0,0,0,0,1,0,0,0, 0,0,0,0,0,0,1,0, 0,0,0,1,0,0,0,0, 以下略