我正在编写一个Sudoku谜题生成器,但是当我编译并运行程序时,我看到的只是一个空白的控制台终端。我一直在等待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;
}
}
答案 0 :(得分:7)
你做错了。你的代码试图通过逐个随机化每个字段来生成有效的数据,检查是否存在冲突。这很可能导致这样的问题:当数据的一部分已经填满时,再也没有有效的解决方案了。这种僵局一直在发生。现有数字并不冲突,但没有办法填补其余部分。只需从报纸上拿走任何数独游戏并随机填写几个字段,这样它们就不会立即发生冲突。最有可能的是,你将无法再完成数独。
这个问题是什么让数独成为一个难题,你的程序忽略它 - 所以它必须失败(除非随机生成器真的,真的,真的今天幸运)。
更好的生成数据的方法是从已知的有效数据开始,而不是交换行和列(总是在3行/列块内),以及三行/列的整个块和交换数字(例如将每3个替换为7个,同时每7个替换3个,这样每次交换都会使整个数据保持有效。