2017-04-16 119 views
0

我目前正在研究N皇后问题,其中输入将是二维数组的大小和二维数组的实际值。这段代码将检查这个输入是否有效,因为没有其他皇后互相攻击,或者没有。如果它有效,你只需打印出true,否则打印出false。我的代码约95%完成,但我在对角线上遍历2D阵列时遇到了问题。我希望能够检查NE,NW,SE,SW对角线,但是我一直在让我的代码超出范围。我知道我为什么一直得到它,我只是不知道如何解决它。我正在寻找一些关于如何解决这个问题的指导。这是我的代码。从各个方向对角线穿过2D阵列

import java.io.*; 
import java.util.*; 
import java.text.*; 
import java.math.*; 
import java.util.regex.*; 

public class nQueensMod { 

public static int r,c; 
public static int[][]board; 

public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
    r = in.nextInt(); 
    c = in.nextInt(); 
    board = new int[r][c]; 
    for(int board_i=0; board_i < r; board_i++){ 
     for(int board_j=0; board_j < c; board_j++){ 
      board[board_i][board_j] = in.nextInt(); 
     } 
    } 

    System.out.println(solve(board,0,0)); 
} 

    public static boolean solve(int[][]board, int row, int col) 
    { 
     if(row >= r) 
     return true; 

     if(board[row][col] == 1) 
     { 
       if(validRows(row,col) && validCols(col,row)) 
       { 
       if(move(row,col)) 
        return true; 
       } 

      /*  
       if(validRows(row,col) && validCols(col,row) && validDiagonal(row,col)) 
       { 
       if(move(row,col)) 
        return true; 
       } 
      */ 
     } 

      else 
      { 
       if(move(row,col)) 
       return true; 
      } 

     return false; 
    } 

    public static boolean validRows(int row, int col) 
    { 
     for (int i = col + 1; i < r; i++) 
     { 
     if (board[row][i] == 1) 
     { 
      return false; 
     } 
     } 

     return true; 
    } 

    public static boolean validCols(int cols, int row) 
    { 
     for (int i = row + 1; i < c; i++) 
     { 
     if (board[i][cols] == 1) 
     { 
      return false; 
     } 
     } 

     return true; 
    } 

/*  
    public static boolean validDiagonal(int row, int cols) 
    { 
     for (int i = 1; i < c; i++) 
     { 

     if (
       //checks SE 
       board[row + i][cols + i] == 1 || 
       //checks SW 
       board[row + i][cols - i] == 1 || 
       //checks NE 
       board[row - i][cols + i] == 1 || 
       //checks NW 
       board[row - i][cols - i] == 1 
      ) 

       return false; 
     } 

     return true; 
    } 
*/  
    public static boolean move(int row,int col) 
    { 
     if(col < board.length - 1) 
      return solve(board,row, col + 1); 

      else 
       return solve(board,row + 1, 0); 
    } 
} 

我注释掉实际validDiagonal方法,因为这是我试过,但我不断收到数组越界异常。这就是我需要帮助的部分。 这里是输入

4 4 
0 1 0 0 
0 0 0 1 
1 0 0 0 
0 0 1 0 

和输出的样本

True 

这是错误我得到

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 
at nQueensMod.validDiagonal(nQueensMod.java:88) 
at nQueensMod.solve(nQueensMod.java:40) 
at nQueensMod.move(nQueensMod.java:108) 
at nQueensMod.solve(nQueensMod.java:50) 
at nQueensMod.main(nQueensMod.java:23) 

这是我第一次张贴在这里,所以我希望我发布正确的方式问题。在此先感谢你们!

+0

你是否已经在调试器中检查了代码?你发现了什么?你为什么不在你的文章中包含堆栈跟踪?请访问[帮助]并阅读[问]以了解如何有效地使用本网站。 –

+0

@JimGarrison是的,我已经使用了我的调试器,它说它在行[0] col [1]上遇到第一个时出界(-1)。我知道发生这种情况是因为当board [row - 1] [cols + 1] == 1被调用时,行已经在0,因此0 - 1 = -1这意味着这是数组越界异常。就像我在我的问题中所述,我知道问题是什么,我只需要指导如何解决问题。 – Rcordero

+0

对不起,这不是StackOverflow的工作原理。我们不会重写您的代码来处理边界条件,这是您需要解决的问题。 –

回答

0

在访问数组之前,您必须检查您的索引是否在范围内。

我会给你一个提示,

// for NW 
if (row-i>0 && col-i>0 && board[row - 1][cols - 1] == 1) 
    return true 

你知道为什么有一个IndexOutOfBoundException?

+0

哦!好的,我知道了!它会返回假,虽然由于板[行 - 1] [cols - 1] == 1.我不知道如何真正检查它是否超出界限,但这是有道理的!谢谢! – Rcordero

+0

是的,这适用于任何索引访问。只需检查在访问之前索引是否在范围内。 – abhipil

+0

明白了!我感谢您的帮助。我能够调整所有的支票,因为这一点,现在我的程序运行像一个魅力。再次感谢! – Rcordero