对于我的计算机课,我的老师希望我们使用递归或回溯来创建和解决一个nXn大小的数独谜题。拼图必须动态分配,拼图的唯一规则是任何行或列都不能重复。对角线和较小的子方块可以有重复。这是我到目前为止所写的内容。
#include<iostream>
#include<time.h>
#include<stdlib.h>
#include<stdio.h>
using namespace std;
void fill_puzzle(int **array, int size);
void delete_puzzle(int array, int size);
bool check_filled(int **array, int size);
bool check_correct(int **array, int size){
int temp=0;
for(int i=0; i<size; i++){
for (int j=0; j<size; j++){
for (int k=0;k<size;k++){
if (array[i][k]==array[i][j])
return false;
else
return true;
}
}
}
}
void fill_puzzle(int **array, int size){
srand(time(NULL));
int random_number;
random_number=(rand()%size);
while(check_correct(array,size)==false)
for(int i=0; i<size; i++){
for (int j=0; j<size; j++){
array[i][j]=random_number;
if (check_correct(array, size) ==false)
fill_puzzle(array, size);
else
cout << array[i][j];
}
}
}
void delete_puzzle(int **array, int size){
for (int i=0; i<size; i++){
delete [] array[i];
}
delete []array;
}
int main(){
int size=0;
int **array;
cout << "Hello, what size puzzle would you like to create? Please type 1 number. Example: 3 would make a 3x3 sudoku puzzle."<<endl;
cin >> size;
if (size <= 0){
cout << "The size you have chosen will not work, please choose a number greater than 0." << endl;
cin >> size;
for (int i=0; i<size; i++){
array=new int*[size];
array[size]=new int [size];
}
}
else {
for (int i=0; i<size; i++){
array=new int*[size];
array[size]=new int [size];
}
fill_puzzle(array,size);
delete_puzzle(array, size);
}
return 0;
}
当我尝试编译时,我得到一个分段错误,并且使用GDB它表示错误发生在if_(array [i] [k] == array [i] [j])的行中的check_correct中。提前谢谢。
答案 0 :(得分:0)
正如我所看到的那样,为2D阵列分配内存的代码不正确,因为您没有正确分配,因此访问非法内存会导致分段错误。
for (int i=0; i<size; i++){
array=new int*[size]; // move it out of loop
array[size]=new int [size]; //array[size]?!
试试这个:
array = new int*[size];
for(int i = 0; i < size; ++i)
array[i] = new int[size];
还有其他问题(fill_puzzle()
陷入无限递归,它导致你的堆栈变得越来越大,直到你得到一个分段错误,在你的数独求解器中,使用调试器来解决它。