liftchampion

sudoku 6

Oct 26th, 2018
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.04 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <stdint.h>
  5.  
  6.  
  7. typedef struct
  8. {
  9.   int line;
  10.   int column;
  11. } t_point;
  12.  
  13.  
  14. void ft_print_matrix(int8_t m[][9], int size)
  15. {
  16.     int i;
  17.     int j;
  18.    
  19.     i = 0;
  20.     while (i < size)
  21.     {
  22.         j = 0;
  23.         while (j < size)
  24.         {
  25.             printf("%d  ", m[i][j]);
  26.             j++;
  27.         }
  28.         printf("\n");
  29.         i++;
  30.     }
  31. }
  32.  
  33. void ft_fill_matrix(int8_t m[][9], int size)
  34. {
  35.     int i;
  36.     int j;
  37.    
  38.     i = 0;
  39.     while (i < size)
  40.     {
  41.         j = 0;
  42.         while (j < size)
  43.         {
  44.             m[i][j] = 0;
  45.             j++;
  46.         }
  47.         i++;
  48.     }
  49. }
  50.  
  51. void ft_fill_data(int8_t m[][9], char data[][9], int size)
  52. {
  53.     int i;
  54.     int j;
  55.    
  56.     i = 0;
  57.     while (i < size)
  58.     {
  59.         j = 0;
  60.         while (j < size)
  61.         {
  62.             if (data[i][j] != '.')
  63.             {
  64.                 m[i][j] = data[i][j] - '0';
  65.             }
  66.             j++;
  67.         }
  68.         i++;
  69.     }
  70. }
  71.  
  72.  
  73. t_point ft_get_square(t_point p)
  74. {
  75.     int line;
  76.     int column;
  77.    
  78.     line = p.line / 3;
  79.     column = p.column / 3;
  80.     return ((t_point){line, column});
  81. }
  82.  
  83. int ft_check_subsquare(int8_t m[][9], t_point sq, int value)
  84. {
  85.     int i;
  86.     int j;
  87.    
  88.     i = sq.line * 3 ;
  89.     while (i < sq.line * 3 + 3)
  90.     {
  91.         j = sq.column * 3;
  92.         while (j < sq.column * 3 + 3)
  93.         {
  94.             if (m[i][j] == value)
  95.                 return (0);
  96.             j++;
  97.         }
  98.         i++;
  99.     }
  100.     return (1);
  101. }
  102.  
  103. int ft_check_lines(int8_t m[][9], t_point p, int value)
  104. {
  105.     int i;
  106.    
  107.     i = 0;
  108.     while (i < 9)
  109.     {
  110.         if (m[i][p.column] == value || m[p.line][i] == value)
  111.             return (0);
  112.         i++;
  113.     }
  114.     return (1);
  115. }
  116.  
  117. int ft_check_insert(int8_t m[][9], t_point p, int value)
  118. {
  119.     int line_check;
  120.     int sq_check;
  121.    
  122.     if (m[p.line][p.column] != 0)
  123.         return (0);
  124.     line_check = ft_check_lines(m, p, value);
  125.     sq_check = ft_check_subsquare(m, ft_get_square(p), value);
  126.     return (line_check * sq_check);
  127. }
  128.  
  129. void ft_matrix_copy(int8_t src[][9], int8_t dest[][9], int size)
  130. {
  131.     int i;
  132.     int j;
  133.    
  134.     i = 0;
  135.     while (i < size)
  136.     {
  137.         j = 0;
  138.         while (j < size)
  139.         {
  140.             dest[i][j] = src[i][j];
  141.             j++;
  142.         }
  143.         i++;
  144.     }
  145. }
  146.  
  147.  
  148. int ft_check_is_already_in(int8_t m[][9], int line_num, int num)
  149. {
  150.     int i;
  151.    
  152.     i = 0;
  153.     while (i < 9)
  154.     {
  155.         if (m[line_num][i] == num)
  156.         {
  157.             return (1);
  158.         }
  159.         i++;
  160.     }
  161.     return (0);
  162. }
  163.  
  164. void ft_fill_line(int8_t m[][9], int line_num, int num)
  165. {
  166.     int i = 0;
  167.     int was_inserted = 0;
  168.    
  169.    
  170.     if (line_num == 10)
  171.     {
  172.         printf("\n\nDONE!\n");
  173.         ft_print_matrix(m, 9);
  174.     }
  175.     if (num == 10)
  176.     {
  177.         printf("\n\n");
  178.         ft_print_matrix(m, 9);
  179.         ft_fill_line(m, line_num + 1, 1);
  180.     }
  181.    
  182.     if (ft_check_is_already_in(m, line_num, num))
  183.     {
  184.         ft_fill_line(m, line_num, num + 1);
  185.     }
  186.    
  187.     while(i < 9)
  188.     {
  189.         if (ft_check_insert(m, (t_point){line_num, i}, num))
  190.         {
  191.             int8_t m_copy[9][9];
  192.             ft_matrix_copy(m, m_copy, 9);
  193.             m_copy[line_num][i] = num;
  194.             was_inserted = 1;
  195.             ft_fill_line(m_copy, line_num, num + 1);
  196.         }
  197.         i++;
  198.     }
  199. }
  200.  
  201. int main()
  202. {
  203.     int8_t matrix[9][9];
  204.    
  205.     ft_fill_matrix(matrix, 9);
  206.    
  207.     char data[9][9] =
  208.     {
  209.         "1....735.",
  210.         "75..3...2",
  211.         ".4.52...1",
  212.         ".2714.5..",
  213.         ".1.6...9.",
  214.         "..3.8.61.",
  215.         "5...92.4.",
  216.         "9...1..25",
  217.         ".318....6"
  218.     };
  219.    
  220.     ft_fill_data(matrix, data, 9);
  221.     printf("\n\n");
  222.     ft_print_matrix(matrix, 9);
  223.     printf("\nresult:\n\n");
  224.    
  225.    ft_fill_line(matrix, 0, 1);
  226.    
  227.    //int solution_count = 0;
  228.    //ft_solve_sudoku(matrix, &solution_count);
  229.    //printf("**%d**", solution_count);
  230.    
  231.  
  232.     return 0;
  233. }
Advertisement
Add Comment
Please, Sign In to add comment