chargpt: 用纯c 写一9*9数独程序

作者 : admin 本文共1974个字,预计阅读时间需要5分钟 发布时间: 2024-06-9 共2人阅读

Chatgpt 真的可以写出完美的代码,学计算机编程没有前途。还有2天就要高考了,大家加油考出好成绩。但不要报编程专业了。

下面是一个完整的9×9数独求解程序,使用C语言实现。这个程序包括读取数独棋盘、解决数独问题并打印解决方案的功能。数独解法使用回溯算法

#include 
#include 

#define N 9

// 检查在给定行是否可以放置数字num
bool isRowSafe(int grid[N][N], int row, int num) {
    for (int col = 0; col < N; col++) {
        if (grid[row][col] == num) {
            return false;
        }
    }
    return true;
}

// 检查在给定列是否可以放置数字num
bool isColSafe(int grid[N][N], int col, int num) {
    for (int row = 0; row < N; row++) {
        if (grid[row][col] == num) {
            return false;
        }
    }
    return true;
}

// 检查在给定3x3子网格是否可以放置数字num
bool isBoxSafe(int grid[N][N], int boxStartRow, int boxStartCol, int num) {
    for (int row = 0; row < 3; row++) {
        for (int col = 0; col < 3; col++) {
            if (grid[row + boxStartRow][col + boxStartCol] == num) {
                return false;
            }
        }
    }
    return true;
}

// 检查在给定位置是否可以放置数字num
bool isSafe(int grid[N][N], int row, int col, int num) {
    return isRowSafe(grid, row, num) && 
           isColSafe(grid, col, num) &&
           isBoxSafe(grid, row - row % 3, col - col % 3, num);
}

// 寻找未分配的位置
bool findUnassignedLocation(int grid[N][N], int *row, int *col) {
    for (*row = 0; *row < N; (*row)++) {
        for (*col = 0; *col < N; (*col)++) {
            if (grid[*row][*col] == 0) {
                return true;
            }
        }
    }
    return false;
}

// 数独求解函数
bool solveSudoku(int grid[N][N]) {
    int row, col;

    // 如果没有未分配的位置,说明解已找到
    if (!findUnassignedLocation(grid, &row, &col)) {
        return true;
    }

    // 尝试放置数字1-9
    for (int num = 1; num <= 9; num++) {
        if (isSafe(grid, row, col, num)) {
            grid[row][col] = num;

            if (solveSudoku(grid)) {
                return true;
            }

            // 如果放置num不成功,撤销赋值
            grid[row][col] = 0;
        }
    }

    // 触发回溯
    return false;
}

// 打印数独棋盘
void printGrid(int grid[N][N]) {
    for (int row = 0; row < N; row++) {
        for (int col = 0; col < N; col++) {
            printf("%2d", grid[row][col]);
        }
        printf("
");
    }
}

int main() {
    // 示例数独问题 (0 表示空格)
    int grid[N][N] = {
        {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}
    };

    if (solveSudoku(grid)) {
        printGrid(grid);
    } else {
        printf("No solution exists
");
    }

    return 0;
}

代码说明

  1. isRowSafe:检查指定行是否安全放置数字。
  2. isColSafe:检查指定列是否安全放置数字。
  3. isBoxSafe:检查3×3子网格是否安全放置数字。
  4. isSafe:综合检查行、列和子网格,判断是否安全放置数字。
  5. findUnassignedLocation:寻找未分配的位置。
  6. solveSudoku:回溯算法解决数独问题。
  7. printGrid:打印数独棋盘。
  8. main:定义数独问题并调用求解和打印函数。

这个程序可以解决9×9的数独问题,并打印出解决方案。可以修改grid数组中的初始值来测试不同的数独问题。

 

本站无任何商业行为
个人在线分享 » chargpt: 用纯c 写一9*9数独程序
E-->