title: java:generalized 8 queen to work for any initial state using depth first search
body: <p>I try to solve 8-queen problem for any initial state (put the 8 queens on any place in the board) but it gives me a stackoverflow exception.</p>
  
  <p>here is my code:</p>
  
  <pre><code>import java.io.IOException;
  
  public class depth {
  public static void main(String[] args) {
  
     //we create a board
     int[][] board = new int[8][8];
     board [0][0]=1;
     board [1][1]=1;
     board [2][2]=1;
     board [3][3]=1;
     board [4][4]=1;
     board [5][5]=1;
     board [6][6]=1;
     board [7][7]=1;
  
   IOException e = null;
     eightQueen(8, board, 0, 0, false);
     System.out.println("the solution as pair");
     for(int i=0;i&lt;board.length;i++){
         for(int j=0;j&lt;board.length;j++)
             if(board[i][j]!=0)
  
             System.out.println("  ("+i+" ,"+j +")");
  
     System.out.println("the number of node stored in memory "+count1);
  
     }
  
     e.printStackTrace();
  
     }
  
     public static int count1=0;
     public static void eightQueen(int N, int[][] board, int i, int j, boolean found) {
  
     long startTime = System.nanoTime();//time start
  
     if (!found) {
      if (IsValid(board, i, j)) {//check if the position is valid
          board[i][j] = 1;
  
          System.out.println("[Queen added at (" + i + "," + j + ")");
          count1++;
          PrintBoard(board);
  
          if (i == N - 1) {//check if its the last queen
              found = true;
              PrintBoard(board);
              double endTime = System.nanoTime();//end the method time
  
              double duration = (endTime - startTime)*Math.pow(10.0, -9.0);
              System.out.print("total Time"+"= "+duration+"\n");
          }
          //call the next step
          eightQueen(N, board, i + 1, 0, found);
      } else {
  
          //if the position is not valid &amp; if reach the last row we backtracking
          while (j &gt;= N - 1) {
              int[] a = Backmethod(board, i, j);
              i = a[0];
              j = a[1];
  
              System.out.println("back at (" + i + "," + j + ")");
              PrintBoard(board);
          }
          //we do the next call
          eightQueen(N, board, i, j + 1, false);
      }
      }
  
     }
  
    public static int[] Backmethod(int[][] board, int i, int j) {
    int[] a = new int[2];
    for (int x = i; x &gt;= 0; x--) {
      for (int y = j; y &gt;= 0; y--) {
          //search for the last queen
          if (board[x][y] != 0) {
              //deletes the last queen and returns the position
              board[x][y] = 0;
              a[0] = x;
              a[1] = y;
              return a;
          }
      }
    }
    return a;
  }
  
  public static boolean IsValid(int[][] board, int i, int j) {
  
  int x;
  //check the queens in column
  for (x = 0; x &lt; board.length; x++) {
      if (board[i][x] != 0) {
          return false;
      }
  }
  //check the queens in row
  for (x = 0; x &lt; board.length; x++) {
      if (board[x][j] != 0) {
          return false;
      }
  }
  //check the queens in the diagonals
  if (!SafeDiag(board, i, j)) {
      return false;
  }
  return true;
  }
  
  public static boolean SafeDiag(int[][] board, int i, int j) {
  
  int xx = i;
  int yy = j;
  while (yy &gt;= 0 &amp;&amp; xx &gt;= 0 &amp;&amp; xx &lt; board.length &amp;&amp; yy &lt; board.length) {
      if (board[xx][yy] != 0) {
          return false;
      }
      yy++;
      xx++;
  }
  xx = i;
  yy = j;
  while (yy &gt;= 0 &amp;&amp; xx &gt;= 0 &amp;&amp; xx &lt; board.length &amp;&amp; yy &lt; board.length) {
      if (board[xx][yy] != 0) {
          return false;
      }
      yy--;
      xx--;
  }
  xx = i;
  yy = j;
  while (yy &gt;= 0 &amp;&amp; xx &gt;= 0 &amp;&amp; xx &lt; board.length &amp;&amp; yy &lt; board.length) {
      if (board[xx][yy] != 0) {
          return false;
      }
      yy--;
      xx++;
  }
  xx = i;
  yy = j;
  while (yy &gt;= 0 &amp;&amp; xx &gt;= 0 &amp;&amp; xx &lt; board.length &amp;&amp; yy &lt; board.length) {
      if (board[xx][yy] != 0) {
          return false;
      }
      yy++;
      xx--;
     }
     return true;
   }
   public static void PrintBoard(int[][] board) {
  System.out.print(" ");
  for (int j = 0; j &lt; board.length; j++) {
      System.out.print(j);
  }
  System.out.print("\n");
  for (int i = 0; i &lt; board.length; i++) {
      System.out.print(i);
      for (int j = 0; j &lt; board.length; j++) {
          if (board[i][j] == 0) {
              System.out.print(" ");
          } else {
              System.out.print("Q");
          }
      }
      System.out.print("\n");
     }
    }
  
    }
  </code></pre>
  
  <p>and the output:</p>
  
  <pre><code>at sun.nio.cs.StreamEncoder.write(Unknown Source)
  at java.io.OutputStreamWriter.write(Unknown Source)
  at java.io.BufferedWriter.flushBuffer(Unknown Source)
  at java.io.PrintStream.write(Unknown Source)
  at java.io.PrintStream.print(Unknown Source)
  at java.io.PrintStream.println(Unknown Source)
  at depth.eightQueen(depth.java:68)
  </code></pre>
  
  <p>the strange thing is it work for the following initial state:</p>
  
  <pre><code>   board [0][0]=1;
     board [1][1]=1;
     board [2][2]=1;
     board [3][3]=1;
     board [4][4]=1;
     board [5][5]=1;
     board [6][6]=1;
     board [7][1]=1;
  </code></pre>