title: java:implement 8 queen using depth first search
body: <p>i am try to implement 8 queen using depth search for any initial state it work fine for empty board(no queen on the board) ,but i need it to work for initial state if there is a solution,if there is no solution for this initial state it will print there is no solution</p>
  
  <p>Here is my code:</p>
  
  <pre><code>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;
  
         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);
     }
        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>for example for this initial state it give me the following error:</p>
  
  <pre><code>Exception in thread "main" java.lang.StackOverflowError
  </code></pre>
  
  <p>i am stuck, i think the error is infinite call for the method how to solve this problem.</p>
  
  <p>any idea will be helpful,thanks in advance.</p>
  
  <p>note:the broad is two dimensional array,when i put (1) it means there queen at this point.</p>
  
  <p>note2:
  we i put the initial state as the following it work:</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>