我想制作一个程序,用蛮力生成数独 9x9 和 1-9 的固定数字数组。随机打乱数组时似乎存在分段错误,我似乎无法找到它实际在哪里。
完整代码在这里,问题出在
inputRandoms
函数中:
#include <time.h>
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
int count = 0;
int matrix[9][9] = { 0 };
void inputRow(int matrix[9][9], int suffeledArr[], int* row);
void inputRandoms(int arr[]);
void newValueInput(int value[]);
void SinglePrintMatrix(int matrix[9][9]);
void main() {
int values[9] = { 1,2,3,4,5,6,7,8,9 };
srand(time(0));
inputRandoms(values);
for (int i = 0; i <= 7; i++) {
if (count == 0) {
inputRow(matrix, values, &count);
}
else {
newValueInput(values);
}
}
SinglePrintMatrix(matrix);
getch();
}
// inputs the row in the matrix
void inputRow(int matrix[9][9], int suffeledArr[], int* count) {
for (int i = 0; i < 9; i++) {
matrix[*count][i] = suffeledArr[i];
}
(*count)++;
}
//generates new inputs and cheaks for uniqueness in colunm, if not unique then rerolls with //inputRandoms() function
void newValueInput(int value[]) {
inputRandoms(value);
int temp[9] = { 0 };
int i, k = count;
for (int j = 0; j < 9; j++) {
for (i = 0; i <= count; i++) {
//puts the value of one colunm in temp[i]
temp[i] = matrix[i][j];
}
// //puts the latest value in temp without removing one of the data
temp[count + 1] = value[j];
// if(count!=k&&count!=8){
// temp[i+1]=value[i];
// }
for (k = count + 1; k >= 0; k--) {
//cheaks for ununique value
if (temp[k] == temp[8 - k]) {
if (((k) / (8 - k)) == 1) {//is uniwue
inputRow(matrix, value, &count);
break;
}
else {//is not unique
newValueInput(value);
break;
}
}
}
}
}
//suffels the value[] array to generate unique combanition of values
void inputRandoms(int arr[]) {
int j = 0, temp = 0, i = 0;
for (i = 8; i > 0; i--) {
while (j < 0 && j >= 10) {
j = rand() % (i + 1); //segmentation error
}
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
// prints out the matrix
void SinglePrintMatrix(int matrix[9][9]) {
printf("Matrix:\n");
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
printf("\n");
}
我问了 ChatGPT 和其他一些 AI 该怎么做并尝试调试,但我不知道当我使用 GDB 时我在做什么。
您需要更改
inputRandoms
来修复循环并进行适当的洗牌。还要尝试确保 j
在范围内。另一个原因可能是您没有正确查找唯一列。这是一些改进的代码:
void inputRandoms(int arr[]) {
for (int i = 8; i > 0; i--) {
int j;
do {
j = rand() % (i + 1);
} while (j < 0 || j >= 10);
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
void newValueInput(int value[]) {
inputRandoms(value);
int temp[9];
for (int j = 0; j < 9; j++) {
for (int i = 0; i <= count; i++) {
temp[i] = matrix[i][j];
}
temp[count] = value[j];
int unique = 1;
for (int k = 0; k < count; k++) {
if (temp[k] == temp[count]) {
unique = 0;
break;
}
}
if (unique) {
inputRow(matrix, value, &count);
break;
}
}
}