Я пытаюсь сделать генератор головоломок Судоку для школьного проекта, и у меня есть большая часть кодирования и логики c, отработанные для программы, просто генератор случайных чисел, который я использую для присвоения значений к сетке Судоку генерируют числа далеко за пределами соответствующего диапазона, и я не могу понять, почему он не работает должным образом. Вот код для генератора чисел:
int Sudoku::RNG(int range, int start){
int randNum;
randNum = (rand()%range+start);
return randNum;
}
Я также добавил
srand(time(NULL));
в самом начале моего основного метода.
И вот код метода, который заполняет сетку Судоку числами из функции RNG ():
void Sudoku::gridPopulate(int grid [9][9]){
Solution s;
int num;
bool safe;
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
do{
safe = false;
num= RNG(9,1);
if(s.rowCheck(grid, i, num)&& s.colCheck(grid, j, num) && s.gridCheck(grid, i, j, num)){
grid[i][j] = num;
cout << "Number entered into grid" << endl;
safe = true;
}
}while(safe);
}
}
Основной метод:
int main()
{
//Program Start
srand(time(NULL));
int difficulty;
int choice;
int grid[9][9];
cout << "Welcome to my Sudoku puzzle generator! \nTest your mental muscles and see if you can solve the puzzle!" << endl;
//Puzzle Generator
Sudoku game;
game.gridPopulate(grid);
cout << "board populated"<< endl;
cout << "Successful board made" << endl;
game.displayBoard(grid);
}
Пример ошибочной платы Судоку ниже (форматирование выключено, потому что из огромных чисел, просто игнорируйте штрихи и вертикальные линии):
1 5013192 4981028 9 |20064 8 5 |1 2 3 |
2 8 5 4 |1995768265 0 2114351727 |28 7670880 7670908 |
3 1 7274056 7 |3 0 7670880 |4 6 7670880 |
-----------------4 6 7 2 |4199040 1 8 |7670912 -1196314433 4 |
5 1953657218 1 0 |5 4 32 |7 3 7274140 |
6 5 8 1953722109 |2 9 7670916 |7274116 4199040 4358512 |
-----------------7 0 1953722297 1 |9 1953787893 3 |7274204 4 8 |
8 1953722109 1953722083 8 |4199040 4199040 0 |9 7274160 2 |
9 3 1953746112 1198757840 |6 7274216 4 |4358512 7274368 4358606 |
-----------------
1 2 3 4 5 6 7 8 9
Число, которое он мне дает, иногда очень велико, иногда нет. В настоящий момент меня это озадачивает, любая помощь или совет будут с благодарностью приняты несколько заявлений о поиске неисправностей. Теперь метод будет оставаться на каждом отдельном элементе массива до тех пор, пока он не будет заполнен. Основная проблема, с которой я сейчас сталкиваюсь, заключается в том, что код застревает в операторе do / while, где происходит RNG (). Я использую счетчик, чтобы отследить, сколько итераций ГСЧ проходит, прежде чем передать безопасное значение в сетку. Проблема в том, что ГСЧ проходит слишком много итераций, прежде чем произойдет, чтобы сгенерировать безопасное значение, иногда тысячи итераций, прежде чем двигаться дальше. В какой-то момент он просто застрянет, бесконечно генерируя случайные числа, не имея возможности двигаться дальше. '
void Sudoku::gridPopulate(int grid [9][9]){
Solution s;
int num;
do{
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
int counter = 0;
do{
srand(time(NULL));
num = RNG(9,1);
counter++;
cout << "RNG attempts: " << counter << endl;
}while(!(s.rowCheck(grid, i, num)&& s.colCheck(grid, j, num) && s.gridCheck(grid, i, j, num)));
grid[i][j]=num;
cout << grid[i][j] << endl;
cout << "Row #: " << i << endl;
cout << "Col #: " << j << endl;
}//end j loop
displayBoard(grid);
}//end i loop
displayBoard(grid);
}while(!validityCheck(grid));
Вот и мой метод displayBoard, хотя я не думаю, что он связан с проблемой.
void Sudoku::displayBoard(int grid[9][9]){
/**********************************************************/
cout << " ----------------------" << endl;
for(int i=0; i<9;i++){
if(i==0)
cout << "1 | ";
if(i==1)
cout << "2 | ";
if(i==2)
cout << "3 | ";
if(i==3)
cout << "4 | ";
if(i==4)
cout << "5 | ";
if(i==5)
cout << "6 | ";
if(i==6)
cout << "7 | ";
if(i==7)
cout << "8 | ";
if(i==8)
cout << "9 | ";
for(int j=0;j<9;j++){
cout << grid[i][j] << " ";
if(j==2)
cout << "| ";
if(j==5)
cout << "| ";
if(j==8)
cout << "| ";
}
cout << endl;
if(i==2)
cout << " ------------------------" << endl;
if(i==5)
cout << " ------------------------" << endl;
if(i==8)
cout << " ------------------------" << endl;
}
cout << "\n";
cout << " 1 2 3 4 5 6 7 8 9 " << endl;
/**********************************************************/
}