Использование Recursion / Backtracking для создания и решения головоломки судоку

0

Для моего компьютерного класса мой учитель хочет, чтобы мы использовали рекурсию или обратную трассировку для создания и решения головоломки sudoku размером 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, он говорит, что ошибка возникает в check_correct в строке с if (array [i] [k] == array [i] [j]). Заранее спасибо.

  • 0
    компиляция не даст вам ошибки сегментации, вы ее запускаете.
  • 0
    да, это то, что я имел в виду
Теги:
recursion
backtracking
sudoku

1 ответ

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() застрявшие в бесконечной рекурсии, это приводит к тому, что ваш стек становится все больше и больше, пока вы не получите ошибку сегментации) в вашем решателе sudoku, используйте отладчик для его решения.

  • 0
    Я хотел избежать использования класса в моей программе просто для простоты, но будет ли проще просто создать класс?
  • 0
    Нет необходимости в такой простой программе.
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню