如何用C语言生成每行每列无重复1-9数的类数独棋盘?
C语言生成行列无重复的类数独棋盘
问题根源
数字重复是因为未对生成的随机数做行列去重校验;隐式声明、类型冲突错误,大多是自定义检查函数未提前声明,或函数返回值、参数类型与调用逻辑不匹配导致。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <time.h> // 提前声明检查函数,避免隐式声明错误 int isExist(int board[9][9], int row, int col, int num); int main() { int board[9][9] = {0}; int row, col, num; // 初始化随机数种子,保证每次运行生成不同棋盘 srand(time(NULL)); for (row = 0; row < 9; row++) { for (col = 0; col < 9; col++) { do { // 生成1-9的随机整数 num = rand() % 9 + 1; // 检查当前行、列是否已存在该数字 } while (isExist(board, row, col, num)); // 确认无重复后填入对应位置 board[row][col] = num; } } // 格式化打印棋盘,模拟3x3矩阵分组 printf("生成的类数独棋盘:\n"); for (row = 0; row < 9; row++) { for (col = 0; col < 9; col++) { printf("%d ", board[row][col]); if ((col + 1) % 3 == 0 && col != 8) { printf("| "); } } printf("\n"); if ((row + 1) % 3 == 0 && row != 8) { printf("---------------------"); printf("\n"); } } return 0; } // 检查数字num是否在指定行或列中存在,存在返回1,不存在返回0 int isExist(int board[9][9], int row, int col, int num) { // 遍历当前行检查 for (int c = 0; c < 9; c++) { if (board[row][c] == num) { return 1; } } // 遍历当前列检查 for (int r = 0; r < 9; r++) { if (board[r][col] == num) { return 1; } } return 0; }
核心问题解决说明
- 隐式声明修复:在
main函数前添加isExist函数的声明,让编译器提前知晓函数的参数类型和返回值类型,避免隐式声明引发的编译错误。 - 类型冲突修复:确保
isExist函数返回值为int(与do-while循环的判断逻辑匹配),参数中的二维数组类型与实际传入的board数组一致,避免类型不兼容问题。 - 去重逻辑实现:使用
do-while循环持续生成随机数,直到找到当前行和列中未出现过的数字,保证每行、每列的1-9数字无重复。 - 随机数有效性:通过
srand(time(NULL))基于系统时间初始化随机种子,避免每次运行生成完全相同的棋盘序列。
内容的提问来源于stack exchange,提问作者Misael Lim
相关产品推荐
相关产品推荐

