2017-02-23 8 views
0

2D 배열로 nQueens 퍼즐 문제를 완료하려고합니다. 현재 요소에 대각선 요소가 사용되었는지 확인하는 데 문제가 있습니까? 다른 for 루프를 시도했지만 다음 행의 출력 만 변경 한 다음 나머지는 동일합니다. 여기 2D 배열의 대각선 요소가 가득 찼는 지 어떻게 확인할 수 있습니까?

내 코드입니다 :

package main; 

public class Board { 
public static final int n = 8; 

static boolean isSafe(boolean[][]board , int r, int c) { 
    int i; 
    int j; 
    for(i = 0; i < r; i++){ 
     if(board[i][c] == true){ 
      return false; 
      } 
    }  
    return true; 
} 
static boolean fillPositions(boolean [][]board, int r){ 
    for(int c = 0; c < n; c++){ 
     if(isSafe(board, r, c)){ 
      board[r][c] = true; 
      if(r == (n - 1) || fillPositions(board, r+1)){ 
       return true; 
      } 
      board[r][c] = false; 
     } 
    } 
    return false; 
} 

public static void main(String[] args){ 
    boolean[][] board = new boolean[n][n]; 

    if(fillPositions(board, 0)){ 
     for(int i = 0; i < n; i++){ 
      for(int j = 0; j < n; j++){ 
       if(board[i][j]){ 
        System.out.print("|Q"); 
       } else { 
        System.out.print("|*"); 
       } 
      } 
      System.out.println("|"); 
     } 
    } else { 
     System.out.println("None"); 
    } 
} 
} 

답변

0

문제는 isSafe 함께 현재의 검사는 다음에 고급 때문에,이 방법은 단지 다음 대각선으로 진행 한 이유는 대각선 요소를 확인하지 않은 row [fillPositions (board, r + 1)] 및 isSafe는 열을 왼쪽으로 스캔하는 것이 었습니다.

다음과 같이 수정

static boolean _isSafe(boolean board[][], int row, int col) 
    { 
     int i, j; 

     /* Check this row on left side */ 
     for (i = 0; i < row; i++) 
      if (board[i][col]) 
       return false; 

     /* Check upper diagonal on left side */ 
     for (i=row, j=col; i>=0 && j>=0; i--, j--) 
      if (board[i][j]) 
       return false; 

     /* Check lower diagonal on left side */ 
     for (i=row, j=col; j>=0 && i<board.length; i++, j--) 
      if (board[i][j]) 
       return false; 

     return true; 
    } 
을 도움이 될 것입니다