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


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

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

    1. #include <stdio.h>
    2. #include <stdbool.h>
    3. #define N 9
    4. // 检查在给定行是否可以放置数字num
    5. bool isRowSafe(int grid[N][N], int row, int num) {
    6. for (int col = 0; col < N; col++) {
    7. if (grid[row][col] == num) {
    8. return false;
    9. }
    10. }
    11. return true;
    12. }
    13. // 检查在给定列是否可以放置数字num
    14. bool isColSafe(int grid[N][N], int col, int num) {
    15. for (int row = 0; row < N; row++) {
    16. if (grid[row][col] == num) {
    17. return false;
    18. }
    19. }
    20. return true;
    21. }
    22. // 检查在给定3x3子网格是否可以放置数字num
    23. bool isBoxSafe(int grid[N][N], int boxStartRow, int boxStartCol, int num) {
    24. for (int row = 0; row < 3; row++) {
    25. for (int col = 0; col < 3; col++) {
    26. if (grid[row + boxStartRow][col + boxStartCol] == num) {
    27. return false;
    28. }
    29. }
    30. }
    31. return true;
    32. }
    33. // 检查在给定位置是否可以放置数字num
    34. bool isSafe(int grid[N][N], int row, int col, int num) {
    35. return isRowSafe(grid, row, num) &&
    36. isColSafe(grid, col, num) &&
    37. isBoxSafe(grid, row - row % 3, col - col % 3, num);
    38. }
    39. // 寻找未分配的位置
    40. bool findUnassignedLocation(int grid[N][N], int *row, int *col) {
    41. for (*row = 0; *row < N; (*row)++) {
    42. for (*col = 0; *col < N; (*col)++) {
    43. if (grid[*row][*col] == 0) {
    44. return true;
    45. }
    46. }
    47. }
    48. return false;
    49. }
    50. // 数独求解函数
    51. bool solveSudoku(int grid[N][N]) {
    52. int row, col;
    53. // 如果没有未分配的位置,说明解已找到
    54. if (!findUnassignedLocation(grid, &row, &col)) {
    55. return true;
    56. }
    57. // 尝试放置数字1-9
    58. for (int num = 1; num <= 9; num++) {
    59. if (isSafe(grid, row, col, num)) {
    60. grid[row][col] = num;
    61. if (solveSudoku(grid)) {
    62. return true;
    63. }
    64. // 如果放置num不成功,撤销赋值
    65. grid[row][col] = 0;
    66. }
    67. }
    68. // 触发回溯
    69. return false;
    70. }
    71. // 打印数独棋盘
    72. void printGrid(int grid[N][N]) {
    73. for (int row = 0; row < N; row++) {
    74. for (int col = 0; col < N; col++) {
    75. printf("%2d", grid[row][col]);
    76. }
    77. printf("\n");
    78. }
    79. }
    80. int main() {
    81. // 示例数独问题 (0 表示空格)
    82. int grid[N][N] = {
    83. {5, 3, 0, 0, 7, 0, 0, 0, 0},
    84. {6, 0, 0, 1, 9, 5, 0, 0, 0},
    85. {0, 9, 8, 0, 0, 0, 0, 6, 0},
    86. {8, 0, 0, 0, 6, 0, 0, 0, 3},
    87. {4, 0, 0, 8, 0, 3, 0, 0, 1},
    88. {7, 0, 0, 0, 2, 0, 0, 0, 6},
    89. {0, 6, 0, 0, 0, 0, 2, 8, 0},
    90. {0, 0, 0, 4, 1, 9, 0, 0, 5},
    91. {0, 0, 0, 0, 8, 0, 0, 7, 9}
    92. };
    93. if (solveSudoku(grid)) {
    94. printGrid(grid);
    95. } else {
    96. printf("No solution exists\n");
    97. }
    98. return 0;
    99. }

    代码说明

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

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

     

  • 相关阅读:
    Mysql热备增量备份与恢复(-)--备份部分
    STM32基于HAL库的USART+DMA使用
    微信扫码授权登录手游(你使用的浏览器暂不支持微信登录)
    Qt编程-QTableView同时冻结行和列
    神经网络训练防止过拟合和欠拟合的方法
    UDP网络编程
    P6772 [NOI2020] 美食家(矩阵快速幂)
    CRMEB多端多语言系统文件上传0Day代审历程
    XWPFTemplate(二)动态生成表格
    手机浏览器哪家强,这3款口碑极佳的浏览器值得一用
  • 原文地址:https://blog.csdn.net/m0_59802969/article/details/139453275