使用递归/回溯来创建和解决数独谜题

时间:2014-03-18 02:33:50

标签: c++ recursion sudoku backtracking

对于我的计算机课,我的老师希望我们使用递归或回溯来创建和解决一个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中。提前谢谢。

1 个答案:

答案 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()陷入无限递归,它导致你的堆栈变得越来越大,直到你得到一个分段错误,在你的数独求解器中,使用调试器来解决它。