2013-08-04 2 views
-3

최근 Sudoku를 해결하고 재귀 및 역 추적을 사용하는 간단한 C 코드를 작성했습니다. 방금 설명한 코드는 아래에서 찾을 수 있습니다. 모든 것이 잘 작동합니다.Sudoku in C vs Sudoku in Java

#include <stdio.h> 
# define INsigned 0 

int grid[9][9]; 
void printGrid(){ 
int row,col; 

for(row=0;row<9;row++){ 
    for(col=0;col<9;col++){ 
     printf("%2d",grid[row][col]); 
     } 
    printf("\n"); 
     } 
} 

int Unsigned(int *row, int* col){ 
int i,j; 
for(i=0;i<9;i++){ 
    for(j=0;j<9;j++){ 

     if(grid[i][j]==0){ 
      *row=i; 
      *col=j; 
      return 1; 


     } 
    } 

} 
return 0; 

} 
int check(){ 
int row=0; 
int col=0; 
int i; 
if(Unsigned(&row, &col)==0) 
    return 1; 


for(i=1;i<=9;i++){ 
    if(conflict(i,row-row%3, col-col%3, row, col)==0){ 

     grid[row][col]=i; 
     if(check()==1) 
      return 1; 
    } 


    grid[row][col]=0; 
} 

return 0; 
} 

int conflict (int num, int srow, int scol, int row, int col){ 

int i,j; 
for(i=0;i<9;i++){ 
    if(grid[row][i]==num) return 1; 
    if(grid[i][col]==num) return 2; 
} 

for(i=0;i<3;i++){ 
    for(j=0;j<3;j++){ 
     if(grid[i+srow][j+scol]==num) return 3; 
    } 
} 
return 0; 

} 

int main(){ 

int i; 

for(i=0;i<9;i++){ 
    scanf("%d %d %d %d %d %d %d %d %d",&grid[i][0],&grid[i][1],&grid[i][2], 
             &grid[i][3],&grid[i][4],&grid[i][5], 
             &grid[i][6],&grid[i][7],&grid[i][8]); 
} 

check(); 
printf("\n\n"); 
printGrid(); 

} 

입력은 : 나는 자바에서 정확한 알고리즘을 작성하려고 할 때

0 0 0 0 0 9 0 0 3 
0 0 5 0 0 0 0 9 0 
3 0 0 8 1 0 2 0 0 
0 0 0 0 4 3 1 0 0 
5 6 0 0 9 0 0 7 8 
0 0 3 5 6 0 0 0 0 
9 0 6 0 8 7 0 0 4 
0 2 0 0 0 0 8 0 0 
1 0 0 9 0 0 0 0 0 

그래서 내가 가지고있는 문제가 발생합니다. java는 원시 타입에 대한 참조에 의한 패스를 허용하지 않기 때문에, 다음 빈 셀을 찾는 부호없는 함수 에서 참조로 패스를 사용했기 때문에. 이 장애물을 극복하기 위해 자바에서 래퍼 클래스를 사용하기로 결정했지만,이 코드는 작동하지 않는 자바 코드와 동일합니다. 코드는 다음과 같습니다.

public class intObj { 

     public int value; 
    } 





public class Grid { 

int grid[][] = new int[9][9]; 
int r = 0; 
int c = 0; 

public Grid(int grid[][]) { 
    this.grid = grid; 
} 

void printGrid() { 
    int row; 
    int col; 
    System.out.println(""); 
    for (row = 0; row < 9; row++) { 
     for (col = 0; col < 9; col++) { 
      System.out.printf("%2d", grid[row][col]); 
     } 
     System.out.println(""); 

    } 
} 

int conflict(int num, int srow, int scol, int row, int col) { 

    int i, j; 
    for (i = 0; i < 9; i++) { 
     if (grid[row][i] == num) { 
      return 1; 
     } 
     if (grid[i][col] == num) { 
      return 2; 
     } 
    } 

    for (i = 0; i < 3; i++) { 
     for (j = 0; j < 3; j++) { 
      if (grid[i + srow][j + scol] == num) { 
       return 3; 
      } 
     } 
    } 
    return 0; 

} 

int Unsigned(intObj row, intObj col) { 

    for (int i = 0; i < 9; i++) { 
     for (int j = 0; j < 9; j++) { 
      if (grid[i][j] == 0) { 

       row.value = i; 
       col.value = j; 
       return 1; 
      } 
     } 
    } 
    return 0; 

} 

int check() { 

    intObj row = new intObj(); 
    intObj col = new intObj(); 

    if (Unsigned(row, col) == 0) { 
     return 1; 
    } 

    for (int i = 1; i <= 9; i++) { 
     if (conflict(i, (row.value) - (row.value) % 3, 
       (col.value) - (col.value) % 3, row.value, col.value) == 0) { 


      grid[row.value][col.value] = i; 
      if (check() == 1) { 
       return 1; 
      } 

     } 

     grid[row.value][col.value] = 0; 
    } 

    return 0; 

} 
} 

메인 클래스 :

어떤 도움이 아주 많이 이해할 수있을 것이다 긴 게시물에 대한
public class Main { 

public static void main(String args[]) { 

    int grid[][] = {{0, 0, 0, 0, 0, 9, 0, 0, 3}, 
     {0, 0, 5, 0, 0, 0, 0, 9, 3}, 
     {3, 0, 0, 8, 1, 0, 2, 0, 0}, 
     {0, 0, 0, 0, 4, 3, 1, 0, 0}, 
     {5, 6, 0, 0, 9, 0, 0, 7, 8}, 
     {0, 0, 3, 5, 6, 0, 0, 0, 0}, 
     {9, 0, 6, 0, 8, 7, 0, 0, 4}, 
     {0, 2, 0, 0, 0, 0, 8, 0, 0}, 
     {1, 0, 0, 9, 0, 0, 0, 0, 0}}; 

    Grid g = new Grid(grid); 


    g.check(); 

    g.printGrid(); 

} 
} 

죄송합니다. 내가 생각할 수있는

+0

U 정수 클래스를 사용할 수있었습니다. – blackSmith

+1

아니요. '정수'는 수정할 수 없습니다. 하지만 그는 org.omg.CORBA.IntegerHolder를 사용할 수있었습니다. – tbodt

+0

정수 클래스가 Java에서 변경 불가능 – Algorithmist

답변

0

가장 간단한 솔루션 ") (체크 안에 자신을 당신의 서명되지 않은 코드를 이동"가

int check(){ 
int row=0; 
int col=0; 
int i; 
if(Unsigned(&row, &col)==0) //Move Unsigned() method code here and that's it 
    return 1; 

II'nd 해결 방법 : 검사에서 만드는이 두 개체() 메서드는 Grid 클래스의 일부 여야하며 check() 메서드에서 로컬로 만들지 마십시오. 문제를 해결해야합니다.

intObj row = new intObj(); 
    intObj col = new intObj();