NQueens с использованием стеков

Моя домашняя работа требует, чтобы я нашел решение головоломки NQueens. Основной метод и метод printSolution написаны моим инструктором. Мы обязаны использовать стеки. Я не могу найти проблему с моим алгоритмом, но он просто ничего не распечатывает.

Я использую 4-значное число для записи положения шахмат (например, 0101 или 1212 и т. Д.) И помещаю действительные в стек, затем я использую другой стек для записи двузначных чисел, чтобы я мог использовать Метод printSolution моего инструктора.

    import java.util.Stack;

    public class NQueens {

      //***** fill in your code here *****
      //feel free to add additional methods as necessary
//to make positions valid, i will use 4-digit numbers to mark the chessboard
     //eg: 0101, or 1212
     //what need to check for validness: 
     //1. the (1 and 2 digit) is not the same(row)
     //2. the (3 and 4 digit) is not the same(column)
     //3. only one number on the same diagonal: isOnDiagonal
public static boolean isOnDiagonal(int chess, int pchess){
    int x= chess/100;
    int y=chess%100;
    int px= pchess/100;
    int py=pchess%100;
    if(Math.abs(px-x)==Math.abs(py-y)){
        return true;
    }
    return false;
}

public static boolean isOnSameColumn(int chess,int pChess){
    int y = chess%100;
    int py = pChess%100;
    int x = chess/100;
    int px = pChess/100;
    if(x==px)
        return true;
    if(y==py)
        return true;
    return false;
}

public static boolean isValid(int chess, Stack<Integer> pChess){
    for(int i=0;i<pChess.size();i++){
      if(isOnDiagonal(chess, pChess.get(i))){
          return false;
      }
      if(isOnSameColumn(chess,pChess.get(i))){
          return false;
      }
    }
    return true;
}
      //finds and prints out all solutions to the n-queens problem
public static int solve(int n) {
        // record the solution numbers
 int solutionNum=0;
         // use stack to record the valid solution
 Stack<Integer> pChess = new Stack<Integer>();//4-digit
 Stack<Integer> pchess = new Stack<Integer>();//1 or 2 digit use to printSolution
 int i=1; 
 int j=1;
 row:{
  while(i<=n){
   //column
   column:{ 
     while(j<=n){
         //every time one way is found, solution number++,print out the solution, go back to last row
         if(pChess.size()==n){
             solutionNum++;
             printSolution(pchess);
             i=i-1;
             pchess.pop();
             j=pchess.pop()+1;
             pChess.pop();
             pChess.pop();
         }
         int chess=i*100+j;

         // the initial chess
         if((i==1)&&(j==1)){
             pChess.push(chess);
             pchess.push(j-1);
             i++;
             break column;
         }

         //push chess into valid positions
         if(NQueens.isValid(chess, pChess)){
                pChess.push(chess);
                pchess.push(j-1);
                j=1;
                i++;
                break column;
         }

         //if the current row has no right position, go back to last row
          if(j==n){ 
                 i--;
                 j=pchess.pop()+1;
                 pChess.pop();
                 if(i==1){
                     break row;
                 }
          }
           j++;





      }//while j loop
    }//column


 }//while row
 }//row
     //update the following statement to return the number of solutions found
      return solutionNum;

      }//solve()

      //this method prints out a solution from the current stack
      //(you should not need to modify this method)
private static void printSolution(Stack<Integer> s) {
  for (int i = 0; i < s.size(); i ++) {
    for (int j = 0; j < s.size(); j ++) {
      if (j == s.get(i))
        System.out.print("Q ");
      else
        System.out.print("* ");
    }//for
    System.out.println();
  }//for
  System.out.println();  
}//printSolution()

      // ----- the main method -----
      // (you shouldn't need to change this method)
       public static void main(String[] args) {

  int n = 8;

      // pass in parameter n from command line
  if (args.length == 1) {
    n = Integer.parseInt(args[0].trim());
  if (n < 1) {
    System.out.println("Incorrect parameter");
    System.exit(-1);
  }//if   
}//if

int number =  solve(n);

System.out.println("There are " + number + " solutions to the " + n + "-queens problem.");
       }//main()

   }

0 ответов

Другие вопросы по тегам