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()
}