【发布时间】:2019-09-04 01:18:21
【问题描述】:
我对这个幻方码有问题已经有一段时间了。我一直在逐步遵循一本书的算法,但由于某些原因它无法正确显示。
int main(){
int n;
char temp[100];
cout << "Enter an odd number: ";
cin >> temp;
n = atoi(temp);
cout << endl;
//error if its even
if (n%2 == 0){
cout << "Input Error!";
return (-1);
cout << endl;
}
int square[n][n];
//places 0 inside
for (int r = 0; r < n; r++){
for (int c = 0; c < n; c++){
square[r][c] = 0;
}
}
//store 1 in middle of first row
square[0][(n-1)/2] = 1;
//current position
int key = 2, i = 0, j = (n-1)/2;
while(key <= n*n){
int k = (i-1)%n, l = (j-1)%n; //look up and left
//square occupied, move down
if (square[k][l] != 0){
i = (i+1)%n;
}
//square (k,l) needs to be assigned
else{
i = k;
j = l;
}
square[i][j] = key; //assign it a value
key++;
}
//display
for (int r = 0; r < n; r++){
for (int c = 0; c < n; c++){
cout << setw(5) << square[r][c] << setw(5);
}
cout << endl;
}
return 0;
}
如果我输入 5 作为奇数,显示会是这样的:
Enter an odd number: 5
5 14 22 20 18
6 15 23 0 19
17 16 24 0 0
0 0 25 0 0
0 0 0 0 0
我期待的输出是:
Enter an odd number: 5
15 8 1 24 17
16 14 7 5 23
22 20 13 6 4
3 21 19 12 10
9 2 25 18 11
似乎是什么问题?
【问题讨论】:
-
仅供参考,标准不支持使用非恒定数组大小:int square[n][n];我很惊讶您可以动态设置超过外部尺寸。
-
在更新方块之前添加行
cout << "square[" << i << "][" << j << "] = " << key << endl;以查看丢失的数字去了哪里。我怀疑您的书可能依赖于负模数 (%) 的结果,这取决于实现,而 C++ 不会检查您是否在数组之外进行索引。 -
大小为 3 时出现错误。使用尽可能小的测试用例使调试更容易。
-
这是我第二次看到这个确切的问题。又是哪本书?上次发现错误真是一场噩梦。
-
@Owl 这本书叫 Ellis Horowitz 和 Sartaj Sahni 的《数据结构基础》。这是我所遵循的算法。i.imgur.com/6NEHn9L.jpg
标签: c++