代码崩溃没有逻辑错误
问题描述:
我通过回溯(有点乱的代码,但我认为它应该工作)做了一个数独求解器,我经历了几次代码,但我不知道它为什么崩溃,我真的很感激它,如果有人可以发现它,谢谢!代码崩溃没有逻辑错误
#include <iostream>
#define N 25
using namespace std;
bool backtrack(int sudoku[N][N],int n);
bool analyze(int sudoku[N][N],int n);
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char** argv)
{
int sudoku[N][N];
int n=0,i,j;
char c=0;
cin.get(c);
while(c!='\n')
{
if(c==32)
{
cin.get(c);
sudoku[0][n]=c;
continue;
}
cin.get(c);
n++;
}
// cout<<"n is"<<n<<endl;
// cout<<"part 1"<<endl;
for(i=1; i<n; i++)
{
for(j=0; j<n; j++)
{
cin>>sudoku[n][j];
}
}
for(i=0; i<n; i++)
{
for(j=0;j<n;j++)
{
// cout<<sudoku[n][j];
}
}
if(backtrack(sudoku,n))
{
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
cout<<sudoku[i][j]<<" ";
}
cout<<endl;
}
}
else
{
cout<<"NO";
}
return 0;
}
bool analyze(int sudoku[N][N],int n)
{
int i,j,k,f,g,l,m;
int compare[N]={0};
// cout<<"analyze test start";
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
if(compare[sudoku[i][j]]==1)
{
// cout<<"before return false test 1";
return false;
}
compare[sudoku[i][j]]=1;
}
for(k=0; k<n; k++)
{
compare[k]=0;
}
}
for(k=0; k<n; k++)
{
compare[k]=0;
}
for(j=0; j<n; j++)
{
for(i=0; i<n; i++)
{
if(compare[sudoku[i][j]]==1)
{
// cout<<"before return false test 2";
return false;
}
compare[sudoku[i][j]]=1;
}
for(k=0; k<n; k++)
{
compare[k]=0;
}
}
for(k=0; k<n; k++)
{
compare[k]=0;
}
for(f=0; f<=n; f+=3)
{
for(g=0; g<=n; g+=3)
{
for(l=0+f; l<3+f; l++)
{
for(m=0+g; m<3+g; m++)
{
if(compare[sudoku[l][m]]==1)
{
// cout<<"before return false test 3";
return false;
}
compare[sudoku[l][m]]=1;
}
}
for(k=0; k<n; k++)
{
compare[k]=0;
}
}
}
return true;
//cout<<"analyze test finish";
}
bool backtrack(int sudoku[N][N],int n)
{
int i,j,value=0;
// cout<<"backtract test start";
for(i=0; i<n; i++)
{
for(j=0; j<n; j++)
{
if(sudoku[i][j]==0)
{
assign:
sudoku[i][j]=value;
if(analyze(sudoku,n))
{
if(backtrack(sudoku,n))
{
return true;
}
else
{
sudoku[i][j]=0;
}
}
else
{
value++;
if(value>n)
{
return false;
}
goto assign;
}
}
value=0;
}
}
//cout<<"backtract test finish";
return true;
}
答
您正在使用固定数组int sudoku [N] [N]并且从不检查边界。如果任何索引超出了适当的尺寸大小,您可能会遇到问题。如果(n> = N)中断,至少应该添加 ;在你的while(c!='\ n')循环中。 更好的解决方案是动态分配数组或使用std :: vector。
它崩溃,因为代码有可怕的intendation。对不起,只是开玩笑,请格式化您的代码,以便它是可读的 – user463035818
开始在调试器中运行以捕捉实际崩溃并找到它在代码中发生的位置。 –
解决这些问题的正确工具是您的调试器。在*堆栈溢出问题之前,您应该逐行执行您的代码。如需更多帮助,请阅读[如何调试小程序(由Eric Lippert撰写)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。至少,您应该\编辑您的问题,以包含一个[最小,完整和可验证](http://*.com/help/mcve)示例,该示例再现了您的问题,以及您在调试器。 –