魔术广场错误的位置
magic square wrong placement of some numbers
我试图创建一个简单的3x3魔法正方形。3x3魔术正方形由连续的整数组成(从1开始,以9结束(将其放入" N"行By'n'列中,以使所有行,所有列和两个对角线总和到同一总数。
我的算法是1个,剩下1个。
我的问题是,我很难弄清楚为什么我不能保留我的上一个数字,而如果下一个列被一个数字占据,那么我就会下跌1。预先感谢您
#include <iostream>
using namespace std;
int main ()
{
int magicsq[3][3];
int i,j,x;
int row=0; //start positon of row
int col=3/2; // and colum
for( i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
magicsq[i][j] = 0; //initialize to 0 your matrix
}
}
magicsq[row][col] = 1; //position to star the counting
for(x=2;x<3*3;x++)
{
row--;
col--;
if(row<0){
row=row+3;
}
if(col<0){
col=col+3;
}
if(magicsq[row][col]!=0)
{
row++; //i think this is where im having trouble
}
magicsq[row][col] = x;
}
for( i = 0; i<3;i++){
for(j = 0; j<3;j++)
{
cout<<magicsq[i][j] <<" ";
}
cout<<endl;
}
}
通过整数问题进行划分;就这样。3/2是1。
if(magicsq[row][col!=0])
也有效(所选的列为0或1(,但我认为您的意思是if(!magicsq[row][col])
我以前从未听说过魔法正方形,并就它们咨询了 Wikipedia 。正如预期的那样,我发现了各种算法的构造描述。
我将DelaLoubère的算法确定为OP显然试图实施的算法。恕我直言,尝试实际上还不错。
我给出的提示(缺少ROW包裹在(if(magicsq[row][col]!=0) row++;
和(缺少迭代步骤中(for (x=2;x<3*3;x++)
似乎是合理的。
考虑到这一点,我已经运行了算法。我的第一个结果看起来还不错,但是结果检查表明这实际上是错误的。我切换了行计数的一些指示,但没有运气。然后,我再次重新介绍了上面的链接文章,并将所描述的内容与我实施的内容进行了比较。最后,我发现我在实施中犯了另一个语义上的错误。我相信OP也做到了:
该方法从第一行的中央列开始,从数字1处开出。之后,填充正方形的基本运动是对角向上和向右的,一次是一步。如果遇到一个填充的正方形,则垂直向下移动一个正方形,然后像以前一样继续。当"向上和向右"移动将离开正方形时,它分别将其包裹在最后一行或第一列。
强调而不是由我完成;我错过的细节。因此,需要更改:如果单元格已经填充,则必须丢弃新单元的坐标。新的坐标为一行向下(即 ++row
(。环绕。修复此样品后,样本计算出正确的结果:
#include <iostream>
int main()
{
int magicsq[3][3] = {0}; // initializes magic square with all 0s
// Algorithm of de la Loubere:
int row = 0, col = 1; // start coordinates
// assign start cell
magicsq[row][col] = 1;
for (int x = 2; x <= 9; ++x) {
// compute up-right coordinates
int rowT = row - 1; if (rowT < 0) rowT += 3;
int colT = col + 1; if (colT >= 3) colT -= 3;
// check whether cell not yet assigned
if (magicsq[rowT][colT]) {
// compute down coordinates
if (++row >= 3) row -= 3;
} else {
// use up-right coordinates
row = rowT; col = colT;
}
// assign next cell
magicsq[row][col] = x;
}
// output of result:
std::cout << "Magic Square:" << std::endl;
for (row = 0; row < 3; ++row) {
for (col = 0; col < 3; ++col) {
std::cout << ' ' << magicsq[row][col];
}
std::cout << std::endl;
}
// check result:
std::cout << "Row sums:";
for (row = 0; row < 3; ++row) {
int sum = 0;
for (col = 0; col < 3; ++col) sum += magicsq[row][col];
std::cout << ' ' << sum;
}
std::cout << std::endl;
std::cout << "Column sums:";
for (col = 0; col < 3; ++col) {
int sum = 0;
for (row = 0; row < 3; ++row) sum += magicsq[row][col];
std::cout << ' ' << sum;
}
std::cout << std::endl;
std::cout << "Diagonal sums: ";
int sumM = 0, sumC = 0;
for (row = 0; row < 3; ++row) {
sumM += magicsq[row][row];
sumC += magicsq[row][2 - row];
}
std::cout << ' ' << sumM << ' ' << sumC << std::endl;
// done
return 0;
}
输出为:
Magic Square:
8 1 6
3 5 7
4 9 2
Row sums: 15 15 15
Column sums: 15 15 15
Diagonal sums: 15 15
IDEONE上的生活演示
注意:
从描述中实现这种算法,您可以很容易地被困。使用的描述根据插图使用"行","行"。因此,需要清晰的映射来定义有关矩阵存储的"向上"answers"向下"的意思。在我的情况下,"行"是 row
降低,"行朝下"是 row
增量。在这种特定情况下,它可能对链接的文章提到可以水平和垂直镜像。
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 奇怪的Arduino C++编译错误取决于文件位置
- 我收到分段错误,但不了解分段错误发生的位置
- 访问特定阵列位置/索引时出现分段错误
- boost::p rogram_options 在指定意外的位置参数时不报告任何错误
- 在尝试使用CUDA分配内存时,我遇到了访问冲突写入位置错误
- 在 C 代码中调用 Python 函数时第三次出现访问冲突写入位置错误
- C++访问冲突读取位置错误
- 无法修复访问冲突读取位置错误
- 如何修复访问冲突读取位置错误
- std::out_of_range 在 getline 的内存位置错误
- 路径位置错误:在 PATH 中找不到程序"make"?
- C++:std::复制失败,出现访问冲突读取位置错误
- C++“访问冲突读取位置”错误
- 线程c++,访问冲突读取位置x错误
- 访问冲突写入位置错误
- cocos2dx精灵设置位置错误
- 当我试图从文件中读取时,访问冲突写入位置错误
- OpenGl的错误.运行时立方体顶点位置错误