【问题标题】:code crashing with no logic error代码崩溃,没有逻辑错误
【发布时间】:2016-09-19 16:07:11
【问题描述】:

我通过回溯制作了一个数独求解器(代码有点乱,但我认为它应该可以工作),我已经多次查看了代码,但我看不出它为什么会崩溃,如果有人能发现它,我将不胜感激,谢谢!

#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;
}

【问题讨论】:

  • 它崩溃是因为代码的意图很糟糕。抱歉,只是开玩笑,请格式化您的代码以便可读
  • 首先在调试器中运行以捕捉正在运行的崩溃并定位它在代码中发生的位置。
  • 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行逐行检查您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
  • 我在 ideone 上尝试了您的代码,但它没有崩溃 (ideone.com/5FgHh1),因此无法提供帮助。但是,如果您仍然有问题,我会建议您先清理代码。您的analyze 函数中似乎有很多无用的代码。此外,您分配了一些循环计数器,例如 m=0+f,这令人不安,并且您在难以调试的递归中使用了 goto

标签: c++ debugging crash


【解决方案1】:

您使用的是固定数组 int sudoku[N][N] 并且从不检查边界。如果任何索引超过适当的维度大小,您可能会遇到问题。至少你应该添加 如果(n >= N)中断;在你的 while(c != '\n') 循环内。 更好的解决方案是动态分配数组或使用 std::vector。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-08
    相关资源
    最近更新 更多