2017-03-01 21 views
-1

스도쿠가 유효한지 아닌지를 확인하는 Java 프로그램이 있습니다. 두 가지 방법이 있습니다. 첫 번째 방법은 모든 열, 하위 격자, 행의 합계를 확인하고 45 일 경우 알려주는 것입니다. 두 번째는 모든 스도쿠의 합이 405인지 예라면 스도쿠는 유효하므로 카운터 예를 찾고 있습니다. 입력에서 스도쿠가 유효하지만 프로그램이 유효하지 않음을 알려줍니다. 이 코드입니다 :스도쿠 솔루션 검사기

public class test_checker { 
    static final boolean valide=true; 
    static final boolean non_valide=false; 

    // verify every sub-grid if it is valid 
     static boolean check_subgrid(int a[][],int ei,int ej){ 
      int sum=0; 
      for(int i=ei;i<ei+3;i++){   
       for(int j=ej;j<ej+3;j++){ 
        sum=sum+a[j][i]; 
       } 
      } 
      if(sum!=45) return non_valide; 
      else return valide; 
     } 
     //verify a sudoku by sum of every row & column & sub-grid 
     static boolean Checker1(int a[][]){ 
      int sum=0; 
      //check row 
      for(int i=0;i<9;i++){ 
       sum=0; 
       for(int j=0;j<9;j++){ 
        sum=sum+a[i][j]; 
       } 
       if(sum!=45) return non_valide; 

      } 
      //check column 
      for(int i=0;i<9;i++){ 
       sum=0; 
       for(int j=0;j<9;j++){ 
        sum=sum+a[j][i]; 
       } 
       if(sum!=45) return non_valide; 
      }  
      //check sub-grid 
      for(int i=0;i<9;i=i+3){ 
       for(int j=0;j<3;j=j+3){ 
        if(check_subgrid(a,i,j)==non_valide) return non_valide; 
       } 
      } 
      return valide; 
     } 
     //verify by sum of all sudoku 
     static boolean Checker2(int a[][]){ 
      int sum=0; 
      for(int i=0;i<9;i++){   
       for(int j=0;j<9;j++){ 
        sum=sum+a[i][j]; 
       } 
      } 
      if(sum!=405) return non_valide; 
      else return valide; 
     } 


    public static void main(String[] args) { 
     int [][] sudoku = 
      { 
       {1,2,3,4,5,6,7,8,9}, 
       {4,5,6,7,8,9,1,2,3}, 
       {7,8,9,1,2,3,4,5,6}, 
       {3,1,2,9,7,8,6,4,5}, 
       {6,4,5,3,1,2,9,7,8}, 
       {9,7,8,6,4,5,3,1,2}, 
       {2,3,1,5,6,4,8,9,7}, 
       {5,6,4,8,9,7,2,3,1}, 
       {8,9,7,2,3,1,5,6,4} 
      }; 
     if(Checker1(sudoku)) System.out.println("it's valide (checker1)!"); 
     else System.out.println("it's not valide !"); 
     if(Checker2(sudoku)) System.out.println("it's valide (checker2) !"); 
     else System.out.println("it's not valide !"); 

    } 

} 
+0

긍정적 인 결과를 줄 것이다 (반복되는 숫자는 총 45 개입니다). 번호가 반복되지 않는지 확인해야합니다. –

+0

이 질문은 http://codereview.stackexchange.com에 더 적합한가요? – Paul

+5

물론 귀하의 기준을 충족시키지 못하는 유효한 9x9 스도쿠가 없습니다. 유효한 스도쿠의 정의에서 직접 따릅니다. 당신이 질문해야 할 질문은 *** 유효하지 않은 *** 9 by 9 그리드인지 여부입니다. 그럼에도 불구하고 ***는 귀하의 기준을 충족시킵니다. –

답변

2

@ 존 볼린저 말했듯이

당신이 요청해야

잘못된 9 9 그리드 012이이 있는지 여부입니다에도 불구하고 귀하의 기준을 충족시킵니다. 내 마음에 오는

간단한 2 예, 있습니다

{5,5,5,5,5,5,5,5,5}, 
{5,5,5,5,5,5,5,5,5}, 
{5,5,5,5,5,5,5,5,5}, 
{5,5,5,5,5,5,5,5,5}, 
{5,5,5,5,5,5,5,5,5}, 
{5,5,5,5,5,5,5,5,5}, 
{5,5,5,5,5,5,5,5,5}, 
{5,5,5,5,5,5,5,5,5}, 
{5,5,5,5,5,5,5,5,5} 

하고 예를 들어, 당신이 9의 대신 0의 대신에 하나의 10의를 둘 것 곳. 각 필드는 행, 열 및 하위 격자에서 구별되고 [1,9] 간격을 유지해야합니다.

1

checker2의 경우 두 행의 값을 반전시킬 수 있습니다. 여기에 내가 4 제 1 및 제 2 행의 1을 반전, 분명히 잘못된 스도쿠하지만 checker2 당신이 잘못된 반응을 가질 수 있기 때문에 당신은 숫자의 합을 확인 안

  {4,2,3,4,5,6,7,8,9}, 
      {1,5,6,7,8,9,1,2,3}, 
      {7,8,9,1,2,3,4,5,6}, 
      {3,1,2,9,7,8,6,4,5}, 
      {6,4,5,3,1,2,9,7,8}, 
      {9,7,8,6,4,5,3,1,2}, 
      {2,3,1,5,6,4,8,9,7}, 
      {5,6,4,8,9,7,2,3,1}, 
      {8,9,7,2,3,1,5,6,4}