Я кодирую генератор головоломок Судоку, но все, что я вижу, это пустой консольный терминал, когда я компилирую и запускаю программу. Я ждал 1 час, но это все еще пустой консольный терминал. Мне интересно, если это из-за какой-либо логической ошибки ИЛИ потому что он все еще обрабатывает. Просто один на один, весь мой код очень длинный. Как я могу оптимизировать его, если проблема с производительностью
Спасибо
#include <iostream>
#include <ctime>
#include <cstdlib>
#include <cmath>
using namespace std;
bool checkrow(int row,int value,int array[][9]);
void producearray(int array[][9]);
bool checksquare(int row,int col,int value,int array[][9]);
bool checkcol(int col,int value,int array[][9]);
void populatearray(int array[][9]);
void printarray(int array[][9]);int main()
{
int array[9][9];
populatearray( array);
producearray(array);
printarray(array);system("PAUSE");
}
bool checkrow(int row,int value,int array[][9])// checks the entire row, returns false if any two numbers in the row are the same
{
for (int j=0;j<9;j++)
{
if (value==array[row][j])
{
return false;}}
return true;}
bool checkcol(int col,int value,int array[][9]) // check if any two numbers in the same column are the same
{
for (int j=0;j<9;j++)
{
if (value==array[j][col])
{
return false;}}
return true;
}
bool checksquare(int row,int col,int value,int array[][9]) //checks if the number within the same square are the same
{
if ( ( row>=0 && row<=2) && (col>=0 && col<=2) )
{
for (int i=0;i<=2;i++)
{
for (int j=0;j<=2;j++)
{
if (array[i][j]== value)
{
return false;
}
}}
return true;}
else if ( ( row>=0 && row<=2) && (col>=3 && col<=5) )
{
for (int i=0;i<=2;i++)
{
for (int j=3;j<=5;j++)
{
if (array[i][j]== value)
{
return false;
}
}}
return true;}
else if ( ( row>=0 && row<=2) && (col>=6 && col<=8) )
{
for (int i=0;i<=2;i++)
{
for (int j=6;j<=8;j++)
{
if (array[i][j]== value)
{
return false;
}
}}
return true;}else if ( ( row>=3 && row<=5) && (col>=0 && col<=2) )
{
for (int i=3;i<=5;i++)
{
for (int j=0;j<=2;j++)
{
if (array[i][j]== value)
{
return false;
}
}}
return true;}
else if ( ( row>=3 && row<=5) && (col>=3 && col<=5) )
{
for (int i=3;i<=5;i++)
{
for (int j=3;j<=5;j++)
{
if (array[i][j]== value)
{
return false;
}
}}
return true;}
else if ( ( row>=3 && row<=5) && (col>=6 && col<=8) )
{
for (int i=3;i<=5;i++)
{
for (int j=6;j<=8;j++)
{
if (array[i][j]== value)
{
return false;
}
}}
return true;}
else if ( ( row>=6 && row<=8) && (col>=0 && col<=2) )
{
for (int i=6;i<=8;i++)
{
for (int j=0;j<=2;j++)
{
if (array[i][j]== value)
{
return false;
}
}}
return true;}
else if ( ( row>=6 && row<=8) && (col>=3 && col<=5) )
{
for (int i=6;i<=8;i++)
{
for (int j=3;j<=5;j++)
{
if (array[i][j]== value)
{
return false;
}
}}
return true;
}
else if ( ( row>=6 && row<=8) && (col>=6 && col<=8) )
{
for (int i=6;i<=8;i++)
{
for (int j=6;j<=8;j++)
{
if (array[i][j]== value)
{
return false;
}
}}
return true;
}
}
void producearray(int array[9][9]) //produces the array
{
bool isrow;
bool iscol;
bool issquare;
for (int i=0;i<9;i++)
{
for (int j=0;j<9;j++)
{
do
{
array[i][j]=rand()%9+1;
isrow=checkrow(i,array[i][j],array);
iscol=checkcol(j,array[i][j],array);
issquare=checksquare(i,j,array[i][j],array);}
while(isrow==false || iscol==false || issquare==false);
}}
}
void populatearray(int array[][9]) // populate the arary
{
for (int i=0;i<9;i++)
{
for (int j=0;j<9;j++)
{
array[i][j]=0;}}}
void printarray(int array[][9]) //prints the array
{
for (int i=0;i<9;i++)
{
for (int j=0;j<9;j++)
{
cout<<array[i][j]
<<"\t";}
cout<<endl;}}
Вы делаете это не правильно. Ваш код пытается сгенерировать действительную судоку, рандомизируя каждое отдельное поле, одно за другим, проверяя, нет ли столкновения. Скорее всего, это приводит к проблеме, заключающейся в том, что когда часть судоку уже заполнена, больше нет действительного решения. Такой тупик случается все время. Существующие числа не конфликтуют, но нет возможности заполнить остальные. Просто возьмите любую газету из газеты и случайным образом заполните несколько полей, чтобы они не вступали в конфликт. Скорее всего, вы не сможете завершить судоку больше.
Эта проблема делает судоку загадкой, а ваша программа игнорирует ее — поэтому она должна потерпеть неудачу (если генератор случайных чисел действительно не действительно, действительно повезло сегодня).
Гораздо лучший способ создания судоку — начать с известного действительного судоку, чем менять строки и столбцы (всегда в пределах 3 строк / столбцов), а также целые блоки из трех строк / столбцов и менять номера (например, заменять каждые 3). с 7 и одновременно каждые 7 с 3), так что каждый своп сохраняет всю судоку в силе.
Других решений пока нет …