2017-04-16 41 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