2012-02-16 2 views
1

안녕하세요, 나는 주어진 코드의 행이나 열 및 블록의 정수를 비교하여 해당 매개 변수 내에 중복이 없는지 확인하는 데 문제가 있습니다. 세 가지 다른 방법으로 세 가지 제약을 분리하거나 한 번에 모두 시도하려고 시도하는 것이 좋은 아이디어인지는 알 수 없습니다.2 차원 배열의 행과 열의 정수 비교. Sudoku

public static rowCheck(int[][] nsudokuBoard) { 

    for (int i =0; i < 9; i++) { 

     for (int j = 0; j < 9; j++) { 
      // (nsudokuBoard) 
     } 
    } 
} 

이것은 내 코드를 시작하는 곳입니다. 전에 너희들이 bash 나 심지어이 2D를 배열의 모든 값을 비교하는 방법에 붙어있는이 메를 컴파일 할 수 없다는 이유로.

답변

2

:

이 코드를 컴파일 시도하지 않은,하지만 당신에게 방법의 아이디어를 줄 것이다
void validate(final int[][] nsudokuBoard) { 
    final int width = nsudokuBoard[0].length; 
    final int depth = nsudokuBoard.length; 

    for (int i = 0; i < width; i++) { 
     int j = i; 
     int reference = nsudokuBoard[i][j]; 

     do { 
      if (j < width) { 
       int current = nsudokuBoard[i][j]; 

       if (current == reference) { 
       // invalid entry found do something 
       } 
      } 
      if (j < depth) { 
       // note reversed indexes 
       int current = nsudokuBoard[j][i]; 

       if (current == reference) { 
       // invalid entry found do something 
       } 
      } 
      ++j; 
     } while ((j >= width) || (j >= depth)); 
    } 
} 

당신의 임무를 완수하십시오. SudokuSquare의 개념을 캡슐화하고 SudokuSquare[][]을 전달하는 클래스를 정의해야한다고 int[][] sudokuBoard을 전달하는 대신 validate 메서드가 모든 잘못된 항목을 포함하는 List<SudokuSquare>을 반환 할 수 있습니다.

+0

나는 다른 방법을 사용하여 당신의 제안을 얻지 못했습니다. 당신이 나를 잃어버린 지점은 SudokuSquare의 개념이었습니다. –

+0

하지만 도움을 주셔서 감사합니다 :) 많이 감사했습니다 –

+0

루프에서 벗어나기 위해 j를 늘릴 위치를 찾는 데 도움이 필요했습니다. 내가 뭔가를 할 잘못된 항목을 찾을 때 귀하의 제안을 참조하십시오.하지만 난 그게 뭔지 전혀 몰라. 더 많은 통찰력? –

0

한 줄로 어떻게 할 것인지 보여줄 것이고 나머지는 알아낼 수 있습니다. 귀하의 값이 1에서 9까지이고, 0이나 "채워지지 않은 항목"이 없다고 가정합니다.

boolean isRowValid(int[][] grid, int row) { 
    boolean[] seen = new boolean[9]; 
    int row; // chosen somewhere else 
    for (int col = 0; col < 9; col++) { 
    if (seen[grid[row][col] - 1]) { // if we've seen this value before in this row 
     return false; // there is a duplicate, and this is a bad sudoku 
    } 
    seen[grid[row][col] - 1] = true; // mark us as having seen this element 
    } 
    return true; // we're all good 
} 
return true; // this row is fine 
아래의 코드와 같이 당신은 2 차원 배열의 모든 값을 비교할 수 있습니다
+0

시퀀스에 배치 된 숫자 집합 (부울 [], 집합 또는 더 나은 BitSet)이 필요합니다. –

0

클래스의 셀을 row, col, block, value 필드로 만듭니다. 필드 셀 = 셀 [], 행렬을 채우는 클래스 행렬을 만듭니다. 기본 메소드 인 Matrix matrix = init (int [] [])로 클래스 검사기를 만들고 init (*)이 매트릭스를 채우는 곳에 (matrix)를 확인하십시오. boolean ok = check (matrix) 여기서 check (Matrix)는 (! rowcheck())가 false를 반환하는 경우 수행합니다. if (! colcheck())가 false를 반환합니다.

getrows(), getrow (r) 및 for (Cell cell : matrix.values ​​())와 같은 일부 메소드를 만들어 원하는 것을 필터링 할 수 있습니다.

조금 지루하지만 나는 그것을했으며 바위처럼 단단합니다.

참고로 매트릭스를 필터링하면 어리석은 것처럼 보일 수 있지만 컴퓨터가 빠르며 문제는 9x9이므로 O (1)입니다.