현재 입력이 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)
를 얻을 오류입니다 여기에 게시하면 나는 올바른 방법으로 질문을 게시하기를 바랍니다. 미리 감사드립니다.
디버거에서 코드를 밟았습니까? 뭘 찾았 니? 왜 귀하의 게시물에 스택 추적을 포함하지 않았습니까? 이 사이트를 효과적으로 사용하는 법을 배우려면 [help]를 방문하고 [ask]를 읽으십시오. –
@JimGarrison 예 디버거를 사용했습니다. 행 [0] col [1]의 처음 1에 도달하면 바운드 (-1)가됩니다. 이것이 행해지는 이유는 보드 [row-1] [cols + 1] == 1이 행이 이미 0에 있으므로 0 - 1 = -1인데 이것이 배열의 범위를 벗어나는 배열이라는 것을 의미하기 때문입니다. 내 질문에 언급했듯이 문제가 무엇인지 알기 때문에 문제를 해결하는 방법에 대한 지침이 필요합니다. – Rcordero
미안하지만, 그건 어떻게 StackOverflow가 작동하지 않습니다. 경계 조건을 처리하기 위해 코드를 다시 작성하지는 않을 것입니다. –