2012-10-19 2 views
0

이 프로그램이하는 일 :자바 : 스도쿠 게임 : 반복 값을 3 × 3 격자를 확인

이 프로그램은 클래스에서 값을 받아 스도쿠 퍼즐의 시작 값으로 사람들을 사용합니다. 우리는 이것을 전형적인 Sudoku 9x9 그리드에서 출력해야합니다. 그러면 프로그램은 사용자에게 그리드의 좌표 점과 값을 입력하라는 메시지를 표시합니다. 현재 내가 작업하고있는 것은 사용자가 입력 한 값이이 퍼즐을 푸는 데 유효하다는 것입니다. 퍼즐이 채워지고 각 열, 행 및 3x3 사각형에 더 이상 반복되는 값이 없으면 게임이 종료되고 출력이 "퍼즐 완성"이어야합니다.

현재로서는 내 프로그램이 열과 행의 반복 된 값을 검사하지만 어디에서 각 3x3 정사각형을 검사해야하는지 잘 모릅니다.

이 퍼즐의 숫자는 9x9 배열로 저장됩니다.

기본적으로 : 배열의 각 3x3 부분에서 반복되는 값을 확인하는 방법에 대한 팁이 있습니까?

+0

9x9 그리드에 사용하는 코드를 게시하십시오. puzzle [i] [j] = Integer.toString (Constants.game [i] [j])에 대한 – Blender

+0

에 대한 (int i = 0; i <9; i ++) for (int j = 0; j <9; j ++) { ])); – user1736639

답변

0

큰 9x9 배열 대신 3x3 배열의 숫자를 저장하고 있습니다. 또는 계산을 쉽게하기 위해 81 바이트의 데이터 저장 (내가 원하는 필드에 바이트를 사용합니까?)이 메모리 부족 문제를 일으키지는 않을 것입니다. 어쨌든 게임을 할 수 있습니다.)

0

어떻게 스도쿠 보드를 저장 하느냐에 달려 있습니다. 2D 배열로 저장하는 경우 로직이 사용자가 새 값을 입력하기 위해 선택한 3x3 상자를 식별하고 이미 행 및 열 섹션을 확인해야하는 코드를 사용할 수 있습니다.

9 세트의 콜렉션도있을 수 있습니다. 각 세트는 특정 3x3 블록에 해당합니다. 따라서 사용자가 값을 추가 할 좌표를 선택하면 주어진 세트를 선택하고 집합에서 add 연산을 수행합니다.

세트가 반복을 허용하지 않으므로 add 메소드는 숫자가 이미 세트에 존재하면 false을 리턴합니다. 이렇게하면 중복 값을 식별 할 수 있습니다 (그러나 배열 옵션과 달리 사용자가 3x3 격자에서 값을 제거하도록 선택하면 세트를 업데이트해야합니다).

0

정확히 같은 문제를 해결하기 위해 약 4 년 전에 C에서 다음 코드를 작성했습니다. 그러나 보이는 것처럼 짐작할 만하다. int 배열은 9x9 격자입니다. "색인"은 0 ... 8 번째 줄, 0 ... 8 번째 열 및 0 ... 8 번째 상자를 지정합니다.

int checkBox(int a[][9], int index) 
{ 
    int i, j, isValid = 1; 
    int m, n; 
    for(i = 3*(index%3) ; isValid && (i < (3*(index%3) + 3)); i++) 
    { 
     for(j = 3*(index/3); isValid && (j < (3*(index/3) + 3)); j++) 
     { 
      for(m = (3*(index%3)) ; isValid && (m < (3*(index%3) + 3)); m++) 
      { 
       for(n = 3*(index/3); isValid && (n < (3*(index/3) + 3)); n++) 
       { 
        if(isValid && (a[m][n] == 0) || ((i != m) || (j != n)) && (a[i][j] == a[m][n]))  //select given element and compare others to it 
        {                   //if any element is the same that is not itself then the sudoku is not valid 
         isValid = 0;             //this checks for 3x3 box 
        }                
       }            
      }             
     } 
    } 
    return isValid; 
} 

기본적으로 내가이 특정 상자를 선택하고, 그 상자에 내가 일치의 어떤 종류가 있는지 모든 번호를 확인할 때까지 그냥 인덱스를 조작했다 않았다. 일치하는 항목이 있으면 스도쿠가 유효하지 않습니다. 그냥 어레이 관리의 고려, 물론

int checkSudoku(int a[][9])          //check every row, column and box 
{             //if there is no contradiction then it is valid 
    int i, isValid = 1; 
    for(i = 0; isValid && (i < 9); i++) 
    { 
     isValid = (checkLine(a, i) && checkColumn(a, i) && checkBox(a, i)); 
    } 
    return isValid; 
} 

, 동일한 개념이 자바에 적용 할 수 있습니다 결국

는이 같은 유효성을 확인.