当前位置:   article > 正文

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

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数组中的初始值来测试不同的数独问题。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/854672
推荐阅读
相关标签
  

闽ICP备14008679号