Судоку в C (палочки)
Привет всем!
Я использую C ,чтобы сделать судоку, но моя программа работает до первой строки и успешно печатает числа от 1 до 9,но вторая строка никогда не делается,потому что программа прилипает.
Я дважды проверил код,но не могу понять,где ошибка, поэтому мне нужна ваша помощь, чтобы выяснить это.
Выход:
Инициализация судоку с нулями...
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
Пытаюсь решить судоку...
1 5 3 4 6 8 2 9 7
и вот программа застревает(навсегда) Я полагаю...
Код:
Что я уже пробовал:
#include <stdio.h> #include <stdlib.h> #include <time.h> int check_all_laws(int (*array)[9] , int row , int column , int number); void initialization_array(int (*array)[9]); int check_rows(int (*array)[9] , int column , int number); int check_columns(int (*array)[9] , int row , int number); int check_square_3_3(int (*array)[9] , int number); int check_all_laws(int (*array)[9] , int row , int column , int number); void solve_array_random(int (*array)[9]); int main(void) { srand(time(NULL)); int array[9][9] = {{0}}; printf("\n\nInitializing sudoku with zeros...\n\n\n"); initialization_array(array); printf("\n\n\n"); printf("Trying to solve sudoku...\n\n\n"); solve_array_random(array); printf("\n\n\nSudoku is solved succesfully !\n\n\n"); } void initialization_array(int (*array)[9]) { for(int i = 0; i < 9; i++) { for(int j = 0; j < 9; j++) { printf("%d " , array[i][j]); } printf("\n"); } } void solve_array_random(int (*array)[9]) { int random; for(int i = 0; i < 9; i++) { for(int j = 0; j < 9; j++) { random = (rand() % 9) + 1; while(check_all_laws(array , i , j , random) == 0) { random = (rand() % 9) + 1; } array[i][j] = random; printf("%d " , array[i][j]); } printf("\n"); } } int check_rows(int (*array)[9] , int column , int number) { int is_ok = 1; for(int i = 0; i < 9; i++) { if(array[i][column] == number) { is_ok = 0; } } return is_ok; } int check_columns(int (*array)[9] , int row , int number) { int is_ok = 1; for(int i = 0; i < 9; i++) { if(array[row][i] == number) { is_ok = 0; } } return is_ok; } int check_square_3_3(int (*array)[9] , int number) { int is_ok = 1; int k = 3; int l = 0; int m = 0; int n = 3; for(int i = l; i < k; i++) { for(int j = m; j < n; j++) { if(array[i][j] == number) { is_ok = 0; } } k += 3; l += 3; if(k == 9) { m += 3; n += 3; l = 0; k = 3; } } return is_ok; } int check_all_laws(int (*array)[9] , int row , int column , int number) { int all_ok = 0; if(check_rows(array , column , number) && check_columns(array , row , number) && check_square_3_3(array , number)) { all_ok = 1; } return all_ok; }
Заранее спасибо! :)
jeron1
Похоже, самое время научиться использовать отладчик, где вы можете пройти через свой код и точно увидеть, что он делает. Visual studio обладает замечательными возможностями отладки.
Rick York
Использование буквального значения 9 везде - плохая идея. Следует избегать использования литеральных значений. Что, если бы вас попросили написать игру судоку, которая работает в шестнадцатеричном формате? или используются значения от 0 до 9? Хлоп.
Вы должны определить значение const, такое как GameSize, чтобы удерживать это число - 9 или 10 или то, что вы хотите использовать для него. Вы можете попробовать свою программу на меньших размерах, таких как 4 или 5, Если хотите, просто чтобы начать работу. Вопрос в том, почему он должен быть зафиксирован на значениях от 1 до 9 или от 0 до 8? Как насчет 0-9 (10 предметов) или 0-9 & A-F (16 предметов) или быть еще более странным 0-9 & A-Z (36 предметов)? Поскольку машина решает их, вы должны дать ей шанс.
Кстати, один из способов справиться с этим - определить отдельный массив для отображения символов, который преобразует значения, внутренние для игры, в значения для отображения. Это облегчит работу с произвольными размерами.