这是我试图解决的N皇后问题,但我有非静态方法的问题..我怎么能解决它.....
* >在count(int)方法..我不明白如何解决这个问题
错误:无法从静态上下文引用非静态方法count()
import java.util.*;
public class NQueens {
static int n;
int[][] board = new int[n][n];
public static void main(String[] args) {
//int result;
int col = 0;
Scanner input=new Scanner(System.in);
n=input.nextInt();
if(n < 4)
System.out.println("the result is 0");
else
count(0);
}
int cnt=0;
void count(int col){
if(col == n){
cnt++;
System.out.println("the result is " + cnt);
}
else{
for(int row=0 ; row<n ; row++){
if(placeQueen(row, col))
count(col+1);
else
removeQueen(row , col);
}
}
}
boolean placeQueen(int row , int col){
boolean x =false;
if(validPlace(row , col)){
setQueen(row , col);
x = true;
}
return x;
}
boolean validPlace(int row ,int col){
boolean x = false;
if(board[row][col] != -1)
x=true;
return x;
}
void setQueen(int row , int col){
board[row][col] = 1;
killCell(row , col);
}
void killCell(int row , int col){
for(int i=col+1 ; i<n ; i++)
board[row][i] = -1;
for(int k=col+1 ; k<n ; k++){
for(int j=0 ; j<n ; j++)
if(Math.abs(row-j) == Math.abs(col-k))
board[j][k] = -1;
}
}
void removeQueen(int row , int col ){
board[row][col] = 0;
refreshCell(row , col);
}
void refreshCell(int row , int col){
for(int i =col+1 ; i<n ; i++)
board[row][i]=0;
for(int k=col+1 ; k<n ; k++){
for(int j=0 ; j<n ; j++)
if(Math.abs(row-j) == Math.abs(col-k))
board[j][k]=0;
}
}
}
答案 0 :(得分:1)
你的main方法是一个静态方法,在创建一个类之前没有你的类的实例。除非有类的实例,否则不能调用count(int)方法。试试这个:
public static void main(String[] args) {
//int result;
int col = 0;
Scanner input=new Scanner(System.in);
n=input.nextInt();
if(n < 4)
System.out.println("the result is 0");
else {
NQueens nq = new NQueens();
nq.count(n);
}
}
另一个问题是你的count(int)方法试图引用'n'变量。它不能,因为它只存在于静态main方法中。你必须将'n'传递给count方法才能看到它。如果你想用起始值初始化类,也许你需要一个取代该值的构造函数,如下所示:
public void NQueens(int starting_n) {
start = starting_n;
}
然后在main中使用NQueens nq = new NQueens(n);
创建对象。您还必须在班级中定义int start = 0;
,以便它可以存储传入的值。