리펙토링, 디자인 패턴 공부하면서 만들어본 스도쿠 계산 프로그램입니다. 알고리즘은 숫자를 순서대로 대입하다가 틀리면 백트랙킹하는 방식입니다. 아직도 리펙토링 해야 할 부분이 많은것 같은데 고수님들의 조언 부탁드립니다.
감사합니다\
int matrix[9][9] = {....}; int sudoku(int x, int y) { int i,j; while(matrix[x][y] > 0) if (++x >= 9) { x = 0; if (++y >= 9) return 0; } do { loop: if (++matrix[x][y] > 9) { matrix[x][y]=0; return -1; } for (i = 0; i < 9; i++) if (i != x && matrix[i][y] == matrix[x][y]) goto loop; for (j = 0; j < 9; j++) if (j != y && matrix[x][j] == matrix[x][y]) goto loop; for (i = (x / 3) * 3; i < (x / 3) * 3 + 3; i++) for (j = (y / 3) * 3; j < (y / 3) * 3 + 3; j++) if ((i != x || j != y) && matrix[i][j] == matrix[x][y]) goto loop; } while(sudoku(x, y) == -1); return 0; } int main() { int i, j, r; r = sudoku(0, 0); for (i = 0; i < 9; i++) { for(j = 0; j < 9; j++) printf ("\t%d", matrix[i][j]); printf("\n"); } return r; }
ㅁㄴㅇㅁ
감사합니다\
c로 만든.
int matrix[9][9] = {....}; int sudoku(int x, int y) { int i,j; while(matrix[x][y] > 0) if (++x >= 9) { x = 0; if (++y >= 9) return 0; } do { loop: if (++matrix[x][y] > 9) { matrix[x][y]=0; return -1; } for (i = 0; i < 9; i++) if (i != x && matrix[i][y] == matrix[x][y]) goto loop; for (j = 0; j < 9; j++) if (j != y && matrix[x][j] == matrix[x][y]) goto loop; for (i = (x / 3) * 3; i < (x / 3) * 3 + 3; i++) for (j = (y / 3) * 3; j < (y / 3) * 3 + 3; j++) if ((i != x || j != y) && matrix[i][j] == matrix[x][y]) goto loop; } while(sudoku(x, y) == -1); return 0; } int main() { int i, j, r; r = sudoku(0, 0); for (i = 0; i < 9; i++) { for(j = 0; j < 9; j++) printf ("\t%d", matrix[i][j]); printf("\n"); } return r; }