我在魔术广场中显示每行和每列的总和时遇到了困难。我的魔方算法很好但是当我试图显示每一方的总和时,它会弄乱我的魔方,它给了我大而负的值。我有一种预感,它与我的索引有关,我花了很长时间弄清楚为什么我无法正确显示它。任何帮助将不胜感激。
幻方是在nxn矩阵中从1到n ^ 2(n平方)的数字排列,每个数字恰好出现一次,并且任何行,任意列的条目总和,或任何主要对角线是相同的。不难证明这个总和必须是n(n ^ 2 + 1)/ 2。
解决这个地方1在广场的第一行中间然后为下一个数字向上移动然后向左移动,如果索引被占用则将其放置在1行中。
抱歉,我用英语解释它并不是那么好。谢谢#include <iostream>
using namespace std;
int main(){
int n,x,y;
cout<<"Enter size of the magic square " <<endl;
cout<<"Must be odd number starting from 3: ";
cin>>n;
while(n%2==0){ //condtion if the entered value is even
cout<<"Please Enter Odd number: ";
cin>>n;
}
cout<<"\n\n";
int array[n][n]; //create 2d matrix
for( x=0;x<n;x++){ //initialize the value of your 2d matrix as 0
for( y=0;y<n;y++){
array[x][y] = 0;
}
}
int row = 0; //your row starting position
int col = n/2; //your colum starting position
array[row][col] =1; //position of your first counting number
for (int i = 2; i <= n*n; ++i) //this is working algorith is up left
{
if((i-1)%n == 0) //if it is occupied go down
{
row++;
}
else
{
row--;
row = (row+n)%n;
col -=1;
col%=n-1;
}
if (col<0){
col = col+n;
}
array[row][col] = i;
} //up to here
for(x=0;x<n;x++){ //display sum in the side
for(y=0;y<n;y++){
array[x][n]+=array[x][y];
}
}
for(x=0;x<n;x++){ //display sum at the bottom
for(y=0;y<n;y++){
array[n][x]+=array[x][y];
}
}
for(x=0;x<=n;x++){ //display your matrix.
for(y=0;y<=n;y++){
cout<<"\t" <<array[x][y] <<" ";
}
cout<<"\n\n";
}
}
答案 0 :(得分:2)
使用
int array[n][n]; //create 2d matrix
仅在某些平台上支持作为扩展。我强烈建议将其更改为使用std::vector
。
std::vector<std::vector<int>> array;
另外,您使用:
array[n][x]+=array[x][y];
和
array[x][n]+=array[x][y];
由于n
不是有效索引,因此这些行会导致未定义的行为。
此外,在这两种情况下,您都在累积行中的值。第二行需要累积列中的值。您需要使用array[y][x]
。
您希望将行的总和和列的总和显示为最终输出以及2D数组的元素。为此,创建n+1 X n+1
矩阵会更容易。你可以使用:
std::vector<std::vector<int>> array(n+1, std::vector<int>(n+1));
计算行总和并将它们存储在n+1
列中的逻辑需要是:
for(x=0;x<n;x++){
array[x][n] = 0;
for(y=0;y<n;y++){
array[x][n] += array[x][y];
}
}
计算列总和并将其存储在n+1
行中的逻辑需要是:
for(x=0;x<n;x++){
array[n][x] = 0;
for(y=0;y<n;y++){
array[n][x] += array[y][x];
}
}