欢迎光临散文网 会员登陆 & 注册

C语言数独程序

2023-06-14 08:00 作者:机器朗读  | 我要投稿

以下是一个简单的用C语言编写的数独程序,可以运行并玩数独游戏。程序使用递归和回溯算法来解决数独谜题。你可以根据需要自行修改和扩展程序。

#include <stdio.h>

#define SIZE 9

// 打印数独棋盘
void printBoard(int board[SIZE][SIZE]) {
    printf("-------------------------\n");
    for (int i = 0; i < SIZE; i++) {
        if (i % 3 == 0 && i != 0) {
            printf("|-------|-------|-------|\n");
        }
        printf("| ");
        for (int j = 0; j < SIZE; j++) {
            if (j % 3 == 0 && j != 0) {
                printf("| ");
            }
            printf("%d ", board[i][j]);
        }
        printf("|\n");
    }
    printf("-------------------------\n");
}

// 检查在指定位置放置数字是否合法
int isSafe(int board[SIZE][SIZE], int row, int col, int num) {
    // 检查行是否合法
    for (int i = 0; i < SIZE; i++) {
        if (board[row][i] == num) {
            return 0;
        }
    }

    // 检查列是否合法
    for (int i = 0; i < SIZE; i++) {
        if (board[i][col] == num) {
            return 0;
        }
    }

    // 检查3x3方格是否合法
    int startRow = row - row % 3;
    int startCol = col - col % 3;
    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            if (board[i + startRow][j + startCol] == num) {
                return 0;
            }
        }
    }

    return 1; // 数字合法
}

// 查找空白位置
int findEmptyLocation(int board[SIZE][SIZE], int *row, int *col) {
    for (*row = 0; *row < SIZE; (*row)++) {
        for (*col = 0; *col < SIZE; (*col)++) {
            if (board[*row][*col] == 0) {
                return 1; // 找到空白位置
            }
        }
    }
    return 0; // 未找到空白位置
}

// 解决数独谜题
int solveSudoku(int board[SIZE][SIZE]) {
    int row, col;
    if (!findEmptyLocation(board, &row, &col)) {
        return 1; // 数独已经解决
    }

    // 尝试填充数字
    for (int num = 1; num <= SIZE; num++) {
        if (isSafe(board, row, col, num)) {
            board[row][col] = num;

            if (solveSudoku(board)) {
                return 1; // 数独已经解决
            }

            board[row][col] = 0; // 回溯
        }
    }

    return 0; // 无解
}

int main() {
    int board[SIZE][SIZE] = {
        {5, 3, 0, 0, 7, 0, 0, 0, 0},
        {6, 0, 0, 1, 9, 5, 0, 0, 0},
        {0, 9, 8, 0, 0, 0, 0, 6, 0},
        {8, 0, 0, 0, 6, 0, 0, 0, 3},
        {4, 0, 0, 8, 0, 3, 0, 0, 1},
        {7, 0, 0, 0, 2, 0, 0, 0, 6},
        {0, 6, 0, 0, 0, 0, 2, 8, 0},
        {0, 0, 0, 4, 1, 9, 0, 0, 5},
        {0, 0, 0, 0, 8, 0, 0, 7, 9}
    };

    printf("数独谜题:\n");
    printBoard(board);
    printf("\n");

    if (solveSudoku(board)) {
        printf("解决后的数独:\n");
        printBoard(board);
    } else {
        printf("无解。\n");
    }

    return 0;
}


C语言数独程序的评论 (共 条)

分享到微博请遵守国家法律