当前位置:首页 > 行业动态 > 正文

c语言解数独的程序

数独是一种逻辑游戏,目标是在一个9×9的网格中填入数字19,使得每行、每列和每个3×3的小网格中的数字都不重复,在C语言中,我们可以使用回溯法来解决数独问题,下面将详细介绍如何使用C语言解决数独问题。

我们需要创建一个9×9的二维数组来表示数独的网格,我们需要实现一个递归函数,该函数将尝试在当前位置填入一个数字,并检查是否满足数独的规则,如果满足规则,则继续尝试下一个位置;否则,回溯到上一个位置并尝试其他数字,当所有位置都填满数字时,数独问题得到解决。

以下是使用C语言解决数独问题的代码:

#include <stdio.h>
#include <stdbool.h>
#define N 9
int grid[N][N];
int row_num[N] = {0};
int col_num[N] = {0};
int block_num[N][N] = {0};
bool is_valid(int row, int col, int num) {
    for (int i = 0; i < N; i++) {
        if (grid[row][i] == num || grid[i][col] == num) {
            return false;
        }
    }
    int start_row = row / 3 * 3;
    int start_col = col / 3 * 3;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (grid[start_row + i][start_col + j] == num) {
                return false;
            }
        }
    }
    return true;
}
bool solve_sudoku(int row, int col) {
    if (row == N) {
        return true;
    }
    if (col == N) {
        return solve_sudoku(row + 1, 0);
    }
    if (grid[row][col] != 0) {
        return solve_sudoku(row, col + 1);
    }
    for (int num = 1; num <= N; num++) {
        if (is_valid(row, col, num)) {
            grid[row][col] = num;
            row_num[row] = 1;
            col_num[col] = 1;
            block_num[row / 3 * 3][col / 3 * 3] = 1;
            if (solve_sudoku(row, col + 1)) {
                return true;
            } else {
                grid[row][col] = 0; // backtracking
            }
        }
    }
    return false;
}
void print_grid() {
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%d ", grid[i][j]);
        }
        printf("
");
    }
}
int main() {
    // initialize the grid with given values (e.g., from a file or user input)
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            grid[i][j] = 0; // assume all cells are empty initially
        }
    }
    if (solve_sudoku(0, 0)) {
        print_grid(); // print the solved grid if successful, otherwise print an error message and exit the program with a nonzero status code
    } else {
        printf("No solution found.");
        return 1; // return a nonzero status code to indicate failure to find a solution
    }
    return 0; // return zero to indicate success in finding a solution or no errors occurred during execution of the program
}

在这个代码中,我们首先定义了一个9×9的二维数组grid来存储数独的网格,我们实现了一个名为is_valid的函数,该函数用于检查在给定位置填入一个数字是否满足数独的规则,接下来,我们实现了一个名为solve_sudoku的递归函数,该函数将尝试在当前位置填入一个数字,并检查是否满足数独的规则,如果满足规则,则继续尝试下一个位置;否则,回溯到上一个位置并尝试其他数字,当所有位置都填满数字时,数独问题得到解决,我们在main函数中初始化数独网格,并调用solve_sudoku函数来解决数独问题,如果找到解决方案,我们将打印出解决后的网格;否则,我们将打印一条错误消息并退出程序。

0