无法从静态上下文引用非静态方法count(int)

时间:2014-04-07 01:48:12

标签: java error-handling non-static n-queens

这是我试图解决的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;
    }
}

}

1 个答案:

答案 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;,以便它可以存储传入的值。