2017-04-16 7 views
0

현재 입력이 2D 배열의 크기와 2D 배열의 실제 값이되는 N Queens 문제에 대해 작업하고 있습니다. 이 코드는 상대방을 공격하는 다른 여왕이 없거나 그렇지 않은 경우이 입력이 유효한지 여부를 확인합니다. 그것의 유효한 당신이 단순히 밖으로 인쇄하는 경우에 틀린 밖으로 인쇄하십시오. 나는 약 95 %가 내 코드로 끝났지 만 2D Array를 대각선으로 통과하는 데 문제가 있습니다. 대각선으로 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

디버거에서 코드를 밟았습니까? 뭘 찾았 니? 왜 귀하의 게시물에 스택 추적을 포함하지 않았습니까? 이 사이트를 효과적으로 사용하는 법을 배우려면 [help]를 방문하고 [ask]를 읽으십시오. –

+0

@JimGarrison 예 디버거를 사용했습니다. 행 [0] col [1]의 처음 1에 도달하면 바운드 (-1)가됩니다. 이것이 행해지는 이유는 보드 [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

오! 알았어! 그것은 보드 [row - 1] [cols - 1] == 1.로 인해 false를 반환 할 것입니다. 실제로 범위를 벗어난 경우 실제로 검사하는 방법은 확실하지 않지만 이것이 합리적입니다! 감사! – Rcordero

+0

예, 이것은 모든 색인 액세스에 해당됩니다. 액세스하기 전에 색인이 범위에 있는지 확인하십시오. – abhipil

+0

알았습니다! 도와 주셔서 감사합니다. 그 때문에 모든 수표를 조정할 수 있었고 지금은 내 프로그램이 매력처럼 실행됩니다. 다시 한 번 감사드립니다! – Rcordero