package p;
import java.util.Stack;
public class Main {
final static int k = 8;
static Stack<Position> s;
static int b[][];
static int answer=0;
public static void paintb(){
for(int i=0;i<k;i++){
for(int j=0;j<k;j++){
System.out.print(b[i][j]+" ");
}
System.out.println();
}
}
public static class Position{
int x;
int y;
public Position(int x,int y) {
this.x=x;
this.y=y;
}
public String toString() {
return("("+x+","+y+")");
}
}
public static int modk(int x,int y,int initial){
if(x+y>=k){
return initial;
}
else if(x+y<0){
return initial;
}
return x+y;
}
public static void placeQueen(int x,int y){
for(int i=0;i<k;i++){
b[x][i]+=1;
b[i][y]+=1;
b[modk(x,i,x)][modk(y,i,y)]+=1;
b[modk(x,i,x)][modk(y,-i,y)]+=1;
b[modk(x,-i,x)][modk(y,i,y)]+=1;
b[modk(x,-i,x)][modk(y,-i,y)]+=1;
}
}
public static void replaceQueen(int x,int y){
for(int i=0;i<k;i++){
b[x][i]-=1;
b[i][y]-=1;
b[modk(x,i,x)][modk(y,i,y)]-=1;
b[modk(x,i,x)][modk(y,-i,y)]-=1;
b[modk(x,-i,x)][modk(y,i,y)]-=1;
b[modk(x,-i,x)][modk(y,-i,y)]-=1;
}
}
public static void findQueen(int num,int row){
if(num>k){
answer++;
System.out.println("Solusion"+answer+" : ");
for(Position p:s){
System.out.print(p);
}
System.out.println();
for(int i=0;i<k;i++){
for(int j=0;j<k;j++){
boolean queen=false;
for(Position p:s){
if(p.x==i&&p.y==j){
queen=true;
}
}
if(queen){
System.out.print("x ");
}
else{
System.out.print("o ");
}
}
System.out.println();
}
System.out.println();
}
else{
for(int i=row;i<k;i++){
for(int j=0;j<k;j++){
if(b[i][j]==0){
placeQueen(i,j);
s.add(new Position(i,j));
findQueen(num+1,i);
s.pop();
replaceQueen(i,j);
}
}
}
}
}
public static void main(String[] args) {
s = new Stack();
b= new int[k][k];
for(int i=0;i<k;i++){
for(int j=0;j<k;j++){
b[i][j]=0;
}
}
findQueen(1,0);
System.out.println(answer+" in total.");
}
}