从各个角度沿对角线穿过2D阵列

时间:2017-04-16 01:43:00

标签: java multidimensional-array traversal diagonal n-queens

我正在研究N Queens问题,其中输入将是2D数组的大小和2D数组的实际值。此代码将检查此输入是否有效,因为没有任何其他任务相互攻击,或者不是。如果它有效,你只需打印出真正的其他打印出来的假。我用我的代码完成了大约95%,但我在对角遍历2D数组时遇到了麻烦。我希望能够对角线检查NE,NW,SE,SW,但我不断在我的代码中使用数组。我知道为什么我一直得到它我只是不知道如何解决它。我正在寻找有关如何解决此问题的一些指导。这是我的代码。

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)

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

1 个答案:

答案 0 :(得分:0)

在访问阵列之前,您必须检查索引是否在范围内。

我会给你一个提示,

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

你知道为什么会有IndexOutOfBoundException吗?