-1

我正在尝试N*N用一些扭曲来实现女王算法。在这个版本中,皇后也可以像骑士一样在国际象棋中移动。

检查对角线和行似乎很好,但是当我尝试在远离我当前位置的“L”位置检查女王时,我得到一个“arrayindexoutofboundexception”。我不完全确定我的 check_Knight 移动是否正确。我似乎无法在我的代码中找到导致问题的错误。

public class QueenGame {

  /**
   * @param args
   */
  static int solution =0;
  static boolean check_Queen(int row, int col, int queens[])
  {     
    for(int i =1; i<col; i++)
    {
      if (queens[col-i] == row   ||
          queens[col-i] == row-i ||
          queens[col-i] == row+i) 
      {
        //flag = false;
        return false;
      }

    }
    return true;

  }

  static boolean  check_KnightMove(int row, int col, int queens[])
  {
    if(queens[col-2] == (row -1) || queens[col-2] == (row+1))
    {
      return false;
    }
    return true;

  }

  static void placement(int col, int queens[], int n){
    //int solution =0; 
    for (int row = 1; row <= n; row++) {
      queens[col] = row;
      if((check_Queen(row,col,queens)) ==  true)
      {
        if((check_KnightMove(row,col,queens)) == true)
        {
          if(col == n)
          {
            solution++;
          }
          else
          { 
            placement(col+1,queens,n);   
          }
        }
      }
    }
    queens[col] = 0;
  }

  public static void main(String[] args) {
    int solution =0;
    Scanner scanner=new Scanner(System.in);
    //System.out.print("Please enter N");
    int n =10;
    //int n = scanner.nextInt();// TODO Auto-generated method stub
    //System.out.print(n);
    int queens[] = new int[n+1];
    placement(1,queens,n);
    System.out.println("nQueens: solution=" + solution);
  }

}
4

1 回答 1

0

如果col是 0 或 1,那么你会得到一个ArrayIndexOutOfBoundsException. 在访问数组之前添加检查。

if ((col >= 2) && (queens[col-2] == (row-1) || queens[col-2] == (row+1)))
于 2013-02-14T23:24:45.437 回答