Quick actions

cmd+k|ctrl+k

Navigation

Languages

Sudoku 2

Snippet info

Language

C

Visibility

public

Author

enm185

Created

2016-05-16T14:44:14Z

Updated

2016-05-16T20:35:36Z

#include <stdio.h>

int thePuzzle[9][9] ;

int solve ( int apuzzle[9][9] ) {
    int puzzle[9][9];
    int p[9][9][9], temp[9];
    int changed;
    int done = 0;
    for ( int r = 0; r < 9; r ++ ) {
        for ( int c = 0; c < 9; c ++ ) {
            puzzle[r][c] = apuzzle[r][c];
            thePuzzle[r][c] = puzzle[r][c];
            for ( int a = 0; a < 9; a ++ ) {
                p[r][c][a] = 1;
            }
        }
    }
    
    while ( ! done ) {
        changed = 0;
        for ( int r = 0; r < 9; r ++) {
            for ( int c = 0; c < 9; c ++ ) {
                
                for ( int a = 0; a < 9; a ++ ) {
                    temp[a] = p[r][c][a];
                }
                
                for ( int x = 0; x < 9; x ++ ) {
                    if ( puzzle[r][x] != 0 && x != c ) {
                        p[r][c][ (puzzle[r][x]-1) ] = 0;
                    }
                }
                
                for ( int y = 0; y < 9; y ++ ) {
                    if ( puzzle[y][c] != 0 && y != r ) {
                        p[r][c][ (puzzle[y][c])-1 ] = 0;
                    }
                }
                
                for ( int r1 = (r/3)*3 ; r1 < (r/3)*3 + 3; r1 ++) {
                    for ( int c1 = (c/3)*3 ; c1 < (c/3)*3 + 3; c1 ++) {
                        if ( puzzle[r1][c1] != 0 && !( r1 == r && c1 == c ) ) {
                            p[r][c][ (puzzle[r1][c1])-1 ] = 0;
                        }
                    }
                }
                
                int sum = 0;
                
                for ( int a = 0; a < 9; a ++ ) {
                    sum += p[r][c][a];
                }
                
                if ( sum == 1 ) {
                    int b = 0;
                    while ( p[r][c][b] == 0 ) {
                        b ++;
                    }
                    puzzle[r][c] = b + 1;
                    thePuzzle[r][c] = b + 1;
                }
                
                changed = 0;
                
                for ( int ax = 0; ax < 0; ax ++ ) {
                    if ( p[r][c][ax] != temp[ax] ) {
                        changed = 1;
                    }
                }
                
            }
        }
        
        
        for ( int r = 0; r < 9; r ++ ) {
            for ( int c = 0; c < 9; c ++ ) {
                
                for ( int i = 0; i < 0; i ++ ) {
                    
                    int yes = 0;
                    
                    for ( int x = 0; x < 9; x ++ ) {
                        if ( p[r][x][i] == 1 && x != c ) {
                            yes = 1;
                        }
                    }
                    
                    for ( int y = 0; y < 9; y ++ ) {
						if ( p[y][c][i] == 1 && y != r ) {
						    yes = 1;
						}
					}

					for ( int r1 = (r/3)*3 ; r1 < (r/3)*3 + 3; r1 ++) {
					    for ( int c1 = (c/3)*3 ; c1 < (c/3)*3 + 3; c1 ++) {
					        if ( p[r1][c1][i] == 1 && !( r1 == r && c1 == c ) ) {
					            yes = 1;
					            
					        }
					    }
					}
					
					if ( yes == 0 ) {
					    puzzle[r][c] = i + 1;
					    thePuzzle[r][c] = i + 1;
				        for ( int x = 0; x < 9; x ++ ) {
		                    if ( puzzle[r][x] != 0 && x != c ) {
		                        p[r][c][ (puzzle[r][x]-1) ] = 0;
		                    }
		                }
		                
		                for ( int y = 0; y < 9; y ++ ) {
		                    if ( puzzle[y][c] != 0 && y != r ) {
		                        p[r][c][ (puzzle[y][c])-1 ] = 0;
		                    }
		                }
		                
		                for ( int r1 = (r/3)*3 ; r1 < (r/3)*3 + 3; r1 ++) {
		                    for ( int c1 = (c/3)*3 ; c1 < (c/3)*3 + 3; c1 ++) {
		                        if ( puzzle[r1][c1] != 0 && !( r1 == r && c1 == c ) ) {
		                            p[r][c][ (puzzle[r1][c1])-1 ] = 0;
		                        }
		                    }
		                }
			                
					}
			                
                    
                }
                
            }
        }
        
        if ( changed == 0 ) {
            int x = 0, y = 0;
            while ( puzzle[x][y] != 0 ) {
                y ++;
                if ( y == 9 ) {
                    y = 0;
                    x ++;
                }
            }
            if ( x > 9 ) {
                return 1;
            }
            
            int finish = 0;
            
            while ( !finish ) {
                for(int i = 0; p[x][y][i] == 0; i ++ ) {
                    puzzle[x][y] ++;
                }
                //puzzle[x][y] ++;
                
                solve(puzzle);
                
                finish = 1;
                for ( int r = 0; r < 9; r ++) {
                    for ( int c = 0; c < 9; c ++) {
                        if ( thePuzzle[r][c] == 0 || thePuzzle[r][c] > 9 ) {
                            finish = 0;
                        }
                    }
                }
                if ( finish ) {
                    for ( int r = 0; r < 9; r ++) {
                        for ( int c = 0; c < 9; c ++) {
                            puzzle[r][c] = thePuzzle[r][c];
                        }
                    }
                }
            }
            
        }
        
        done = 1;
        
        for ( int r = 0; r < 9; r ++ ) {
            for ( int c = 0; c < 9; c ++ ) {
                if ( puzzle[r][c] == 0 ) {
                    done = 0;
                }
            }
        }
        
    }
    
    return 1; 
    
}

int main(void) {
    int puzzle[9][9] =
    {
        { 0, 0, 6, 0, 0, 0, 0, 0, 4 },
        { 0, 0, 0, 8, 6, 0, 7, 3, 0 },
        { 0, 4, 0, 3, 5, 0, 0, 0, 2 },
        { 1, 7, 0, 4, 0, 0, 6, 0, 0 },
        { 0, 9, 0, 0, 0, 0, 0, 8, 0 },
        { 0, 0, 8, 0, 0, 6, 0, 1, 7 },
        { 2, 0, 0, 0, 8, 1, 0, 4, 0 },
        { 0, 6, 7, 0, 4, 3, 0, 0, 0 },
        { 8, 0, 0, 0, 0, 0, 3, 0, 0 }
    };
    
    solve(puzzle);
    
    for ( int r = 0; r < 9; r ++ ){
        if( r % 3 == 0 ) {
            if ( r == 0){
                printf("╔═════╤═════╤═════╦═════╤═════╤═════╦═════╤═════╤═════╗\n");
            } else {
                printf("╠═════╪═════╪═════╬═════╪═════╪═════╬═════╪═════╪═════╣\n");
            }
        } else {
            printf("╟─────┼─────┼─────╫─────┼─────┼─────╫─────┼─────┼─────╢\n");
        }
        
        for ( int c = 0; c < 9; c ++ ){
            if( c % 3 == 0 ) {
                printf("║  %d",thePuzzle[r][c]);
            } else {
                printf("│  %d",thePuzzle[r][c]);
            }
            printf("  ");
        }
        printf("║\n");
    }
    printf("╚═════╧═════╧═════╩═════╧═════╧═════╩═════╧═════╧═════╝\n");
    
}
INFO