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