C++ c++;数独程序采用回溯跟踪,分段故障(内核转储),欢迎各界建议 #包括 使用名称空间std; //定义9X9网格。 INTA[9][9]={{0,0,3,0,9,2,6,0,0}, {1,0,0,3,0,0,8,0,0}, {0,0,5,0,1,0,0,4,0}, {0,3,0,0,0,0,2,5,8}, {2,4,0,0,5,0,0,0,0}, {0,0,0,6,2,0,0,0,3}, {0,1,4,0,0,9,0,3,0}, {6,0,0,7,0,0,1,0,0}, {3,0,0,0,0,4,0,0,2} }; //类数独。 类数独{ 公众: int行,列,i,j,num; //检查特定行中是否存在元素。 布尔行检查(int a[9][9],int&row,int num) { 对于调用后的(j=0;j
:C++ c++;数独程序采用回溯跟踪,分段故障(内核转储),欢迎各界建议 #包括 使用名称空间std; //定义9X9网格。 INTA[9][9]={{0,0,3,0,9,2,6,0,0}, {1,0,0,3,0,0,8,0,0}, {0,0,5,0,1,0,0,4,0}, {0,3,0,0,0,0,2,5,8}, {2,4,0,0,5,0,0,0,0}, {0,0,0,6,2,0,0,0,3}, {0,1,4,0,0,9,0,3,0}, {6,0,0,7,0,0,1,0,0}, {3,0,0,0,0,4,0,0,2} }; //类数独。 类数独{ 公众: int行,列,i,j,num; //检查特定行中是否存在元素。 布尔行检查(int a[9][9],int&row,int num) { 对于调用后的(j=0;j,c++,backtracking,C++,Backtracking,:unAssigned(a,row,col)当unAssigned()返回false时,row的值为9,col的值为9。这是使用对row和col的引用的结果 #include <iostream> using namespace std; //defining 9X9 grid. int a[9][9] ={{0,0,3,0,9,2,6,0,0}, {1,0,0,3,0,0,8,0,0}, {0,0,5,0
unAssigned(a,row,col)
当unAssigned()
返回false时,row
的值为9,col
的值为9。这是使用对row
和col
的引用的结果
#include <iostream>
using namespace std;
//defining 9X9 grid.
int a[9][9] ={{0,0,3,0,9,2,6,0,0},
{1,0,0,3,0,0,8,0,0},
{0,0,5,0,1,0,0,4,0},
{0,3,0,0,0,0,2,5,8},
{2,4,0,0,5,0,0,0,0},
{0,0,0,6,2,0,0,0,3},
{0,1,4,0,0,9,0,3,0},
{6,0,0,7,0,0,1,0,0},
{3,0,0,0,0,4,0,0,2} };
// class sudoku.
class sudoku{
public:
int row,col,i,j,num;
//to check presence of element in particular row.
bool rowCheck(int a[9][9],int &row,int num)
{
for(j=0;j<9;j++)
{
if(a[row][j]==num)
return true;
}
return false;
}
//to check presence of element in particular column.
bool colCheck(int a[9][9], int &col, int num)
{
for(j=0;j<9;j++)
{
if(a[j][col]==num)
return true;
}
return false;
}
//to check presence of element in particular 3X3 grid.
bool boxCheck(int a[9][9],int &row ,int &col ,int num)
{
int x,y;
if(row<3)
x=0;
else if(row>=3 && row<6)
x=3;
else
x=6;
if(col<3)
int y=0;
else if(col>=3 && col<6)
y=3;
else
y=6;
for(i=x;i<x+3;i++)
{
for(j=y;j<y+3;j++)
{
if(a[i][j]==num)
return true;
}
}
return false;
}
//to check index which is unassigned.
bool unAssigned(int a[9][9],int &row,int &col)
{
for(row=0;row<9;row++)
{
for(col=0;col<9;col++)
{
if(a[row][col]==0){
return true;}
}
}
return false;
}
//to return true if position is suitable to insert .
bool isSafe(int a[9][9],int &row,int &col,int num)
{
if(!rowCheck(a,row,num) && !colCheck(a,col,num) &&
!boxCheck(a,row,col,num))
return true;
else
return false;
}
//function to solve sudoku.
bool sudokuSolver(int a[9][9])
{
if(!unAssigned(a,row,col))
return true;
for(i=1;i<=9;i++)
{
if(isSafe(a,row,col,i))
{
a[row][col]=i;
cout<<a[row][col];
if(sudokuSolver(a))
return true;
a[row][col]=0;
}
}
return false;
}
void display(int a[9][9])
{
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
//class ends
};
//main method
int main()
{
sudoku s;
s.sudokuSolver(a);
s.display(a);
return 0;
}
您从不初始化
行
和列
,一旦使用它们的值,就会导致未定义的行为
除此之外,我建议您避免硬编码数组边界和原始循环。如果您使用容器和迭代器,您可以完全避免越界错误(这里不是问题所在,而是一行
)(i=1;我请花一些时间阅读,尤其是名为and的部分。还有请和。最后,请学习如何创建。我还建议您花一些时间阅读Eric Lippert的文章,并学习如何使用调试器捕获崩溃。我认为这是:(i=1;i请研究并应用a的概念。您引用的代码远远不是最小值。“分段错误(内核转储),欢迎所有建议”远远不是一个精确的问题。您需要将其缩小一点,即使您无法使用调试器(),您应该能够更好地找出问题所在。制作MCVE实际上有助于解决这一问题。不要使用成员变量来保存击键。使用局部变量进行迭代。看起来您已经采用了一个带有自由函数的解决方案,并将其塞进了“面向对象”中解决方案。我认为您很接近,但将行
和列
作为方法参数的使用与作为对象属性的使用进行排序会很有帮助。大多数情况下是引用参数(它们本身不能未初始化)。请详细说明在初始化之前这些标识符在何处使用,以及这是如何导致SEGFULT的。引用的属性未初始化,但需要一直跟踪。@Yunnosch是的,我刚才看到了你的评论并添加了一句话。但是,主要问题仍然是访问单元化值导致UBTrue。我进行了微调我的评论。事实上,我认为根本原因是@molbdnilo。似乎属性col和row的语义对OP来说都不清楚,这导致了这个答案所描述的情况。@Yunnosch无论如何,OP似乎已经失去了兴趣,我也失去了兴趣;)
bool unAssigned(int a[9][9],int &row,int &col)
{
for(row=0;row<9;row++)
{
for(col=0;col<9;col++)
{
if(a[row][col]==0){
return true;}
}
}
// here: row is 9 and col is 9
return false;
}
if(sudokuSolver(a))
return true;
// here row or col are equal to 9 which is out of bounds
a[row][col]=0; // seg-fault here