Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <stdint.h>
- typedef struct
- {
- int line;
- int column;
- } t_point;
- void ft_print_matrix(int8_t m[][9], int size)
- {
- int i;
- int j;
- i = 0;
- while (i < size)
- {
- j = 0;
- while (j < size)
- {
- printf("%d ", m[i][j]);
- j++;
- }
- printf("\n");
- i++;
- }
- }
- void ft_fill_matrix(int8_t m[][9], int size)
- {
- int i;
- int j;
- i = 0;
- while (i < size)
- {
- j = 0;
- while (j < size)
- {
- m[i][j] = 0;
- j++;
- }
- i++;
- }
- }
- void ft_fill_data(int8_t m[][9], char data[][9], int size)
- {
- int i;
- int j;
- i = 0;
- while (i < size)
- {
- j = 0;
- while (j < size)
- {
- if (data[i][j] != '.')
- {
- m[i][j] = data[i][j] - '0';
- }
- j++;
- }
- i++;
- }
- }
- t_point ft_get_square(t_point p)
- {
- int line;
- int column;
- line = p.line / 3;
- column = p.column / 3;
- return ((t_point){line, column});
- }
- int ft_check_subsquare(int8_t m[][9], t_point sq, int value)
- {
- int i;
- int j;
- i = sq.line * 3 ;
- while (i < sq.line * 3 + 3)
- {
- j = sq.column * 3;
- while (j < sq.column * 3 + 3)
- {
- if (m[i][j] == value)
- return (0);
- j++;
- }
- i++;
- }
- return (1);
- }
- int ft_check_lines(int8_t m[][9], t_point p, int value)
- {
- int i;
- i = 0;
- while (i < 9)
- {
- if (m[i][p.column] == value || m[p.line][i] == value)
- return (0);
- i++;
- }
- return (1);
- }
- int ft_check_insert(int8_t m[][9], t_point p, int value)
- {
- int line_check;
- int sq_check;
- if (m[p.line][p.column] != 0)
- return (0);
- line_check = ft_check_lines(m, p, value);
- sq_check = ft_check_subsquare(m, ft_get_square(p), value);
- return (line_check * sq_check);
- }
- void ft_matrix_copy(int8_t src[][9], int8_t dest[][9], int size)
- {
- int i;
- int j;
- i = 0;
- while (i < size)
- {
- j = 0;
- while (j < size)
- {
- dest[i][j] = src[i][j];
- j++;
- }
- i++;
- }
- }
- int ft_check_is_already_in(int8_t m[][9], int line_num, int num)
- {
- int i;
- i = 0;
- while (i < 9)
- {
- if (m[line_num][i] == num)
- {
- return (1);
- }
- i++;
- }
- return (0);
- }
- void ft_fill_line(int8_t m[][9], int line_num, int num)
- {
- int i = 0;
- int was_inserted = 0;
- if (line_num == 10)
- {
- printf("\n\nDONE!\n");
- ft_print_matrix(m, 9);
- }
- if (num == 10)
- {
- printf("\n\n");
- ft_print_matrix(m, 9);
- ft_fill_line(m, line_num + 1, 1);
- }
- if (ft_check_is_already_in(m, line_num, num))
- {
- ft_fill_line(m, line_num, num + 1);
- }
- while(i < 9)
- {
- if (ft_check_insert(m, (t_point){line_num, i}, num))
- {
- int8_t m_copy[9][9];
- ft_matrix_copy(m, m_copy, 9);
- m_copy[line_num][i] = num;
- was_inserted = 1;
- ft_fill_line(m_copy, line_num, num + 1);
- }
- i++;
- }
- }
- int main()
- {
- int8_t matrix[9][9];
- ft_fill_matrix(matrix, 9);
- char data[9][9] =
- {
- "1....735.",
- "75..3...2",
- ".4.52...1",
- ".2714.5..",
- ".1.6...9.",
- "..3.8.61.",
- "5...92.4.",
- "9...1..25",
- ".318....6"
- };
- ft_fill_data(matrix, data, 9);
- printf("\n\n");
- ft_print_matrix(matrix, 9);
- printf("\nresult:\n\n");
- ft_fill_line(matrix, 0, 1);
- //int solution_count = 0;
- //ft_solve_sudoku(matrix, &solution_count);
- //printf("**%d**", solution_count);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment