我正在尝试编写一个数独求解器。
我几乎完成了输入,但是一些奇怪的事情开始发生了。在[i][9]
的索引int sudoku[i][9]
上,有一些我从未放过的数字。
例如,当我使用using namespace std;
下方注释的输入运行下面的代码时,输出为:
410270805
085146097
070580040
927451386
538697412
164328759
852704900
090802574
740965028
当然,我只需要0到8,但我想知道是什么导致整数出现在第9个索引。
这是代码:
#include <iostream>
#include <math.h>
#include <cstdlib>
using namespace std;
/*
410270805
085146097
070580040
927451386
538697412
164328759
852704900
090802574
740965028
*/
int main()
{
int sudoku[9][9];
int solving[9][9][9];
int input;
for (int i=0; i<=8; i++) {
cin >> input;
int j;
int k;
for (j=8, k=1; j>=0; j--, k++) {
int asdf = input/pow(10,k-1);
sudoku[i][j] = asdf % 10;
}
}
cout << endl;
for (int i=0; i<=8; i++) {
for (int j=0; j<=9; j++) {
cout << sudoku[i][j];
}
cout << endl;
}
return 0;
}
答案 0 :(得分:2)
访问数组定义区域之外的元素是Undefined Behavior(UB)。
这意味着它可以:
基本上不要这样做。
事实上,阻止自己做到这一点。将这些数组替换为std::vectors
并使用.at()
调用。
例如:
std::vector<std::vector<int>> sudoku(9, std::vector<int>(9, 0));
for (int i=0; i<=8; i++) {
for (int j=0; j<=9; j++) {
cout << sudoku.at(i).at(j);
}
cout << endl;
}
然后,您将获得抛出的运行时异常,该异常解释您的问题而不是随机整数或段错误。
答案 1 :(得分:-2)
我认为我发现了您的问题,在您使用j <= 9
代替j <= 8
的最后一个循环中。然后,您尝试编写(j)
,这样就可以将9
打开。{1}}。尝试将9
替换为8
。