在 C++ 中使用具有用户输入维度的动态分配二维数组生成 NxN 幻方
Generating an NxN magic square using a dynamically allocated 2D array in C++ with user-input dimension
我正在尝试通过动态内存分配生成并求解 NxN 奇数幻方,但每当我 运行 代码时,它在终端上什么都不显示,程序结束。我认为它与二维数组的动态分配有关,因为当我制作一个具有恒定大小的普通 NxN 数组时,程序 运行 没问题。对此,我将不胜感激!
#include<bits/stdc++.h>
#include<cmath>
using namespace std;
void calcuateMagicSquare(int N)
{
int **Array;
Array=new int*[N];
for(int i=0; i<N; i++)
{
Array[i]=new int[N];
}
memset(Array, 0, sizeof(Array));
int nSquare=N*N;
int i=N/2;
int j=N-1;
for(int k=1; k<=nSquare;)
{
if(i==-1 && j==N)
{
j=N-2;
i=0;
}
else
{
if(j==N)
{
j=0;
}
if(i<0)
{
i=N-1;
}
}
if(Array[i][j])
{
j=j-2;
i++;
continue;
}
else
{
Array[i][j]=k++;
}
j++;
i--;
}
int SolutionMagicSquare=N*(N*N+1)/2;
cout << "Solution of the magic Square: " << SolutionMagicSquare << endl;
cout << "MAGIC SQUARE: \n" << endl;
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
{
cout << setw(4) << Array[i][j] << " ";
cout << endl;
}
}
}
int main()
{
int N;
cout << "Please enter the dimension of the magic square:" << endl;
cin >> N;
calcuateMagicSquare(N);
}
这还不错。
int ** Array=new int*[N];
for(int i=0; i<N; i++)
{
Array[i]=new int[N];
}
memset(Array, 0, sizeof(Array));
memset 给您带来了麻烦,它的错误有两个原因。首先,假设你真的想这样做。你没有,但假设你有。 sizeof(Array)
有多大。数组是一个 int **
。在 64 位机器上,这是 8 个字节。这么方便,你只销毁了第一个指针。
你真正需要做的是:
int ** Array=new int*[N];
// Don't do this memset, but showing you what it should look like)
memset(Array, 0, sizeof(int *) * N);
for(int i=0; i<N; i++)
{
Array[i]=new int[N];
// But this one is safe
memset(Array[i], 0, sizeof(int) * N);
}
您的版本正在擦除第一个指针 -- Array[0]
。我把第一个 memset 放在那里,这样你就可以在需要时看到它的样子。这是你需要的第二个。您正在清除 int 的大小乘以您拥有的 int 的数量。
我正在尝试通过动态内存分配生成并求解 NxN 奇数幻方,但每当我 运行 代码时,它在终端上什么都不显示,程序结束。我认为它与二维数组的动态分配有关,因为当我制作一个具有恒定大小的普通 NxN 数组时,程序 运行 没问题。对此,我将不胜感激!
#include<bits/stdc++.h>
#include<cmath>
using namespace std;
void calcuateMagicSquare(int N)
{
int **Array;
Array=new int*[N];
for(int i=0; i<N; i++)
{
Array[i]=new int[N];
}
memset(Array, 0, sizeof(Array));
int nSquare=N*N;
int i=N/2;
int j=N-1;
for(int k=1; k<=nSquare;)
{
if(i==-1 && j==N)
{
j=N-2;
i=0;
}
else
{
if(j==N)
{
j=0;
}
if(i<0)
{
i=N-1;
}
}
if(Array[i][j])
{
j=j-2;
i++;
continue;
}
else
{
Array[i][j]=k++;
}
j++;
i--;
}
int SolutionMagicSquare=N*(N*N+1)/2;
cout << "Solution of the magic Square: " << SolutionMagicSquare << endl;
cout << "MAGIC SQUARE: \n" << endl;
for(int i=0; i<N; i++)
{
for(int j=0; j<N; j++)
{
cout << setw(4) << Array[i][j] << " ";
cout << endl;
}
}
}
int main()
{
int N;
cout << "Please enter the dimension of the magic square:" << endl;
cin >> N;
calcuateMagicSquare(N);
}
这还不错。
int ** Array=new int*[N];
for(int i=0; i<N; i++)
{
Array[i]=new int[N];
}
memset(Array, 0, sizeof(Array));
memset 给您带来了麻烦,它的错误有两个原因。首先,假设你真的想这样做。你没有,但假设你有。 sizeof(Array)
有多大。数组是一个 int **
。在 64 位机器上,这是 8 个字节。这么方便,你只销毁了第一个指针。
你真正需要做的是:
int ** Array=new int*[N];
// Don't do this memset, but showing you what it should look like)
memset(Array, 0, sizeof(int *) * N);
for(int i=0; i<N; i++)
{
Array[i]=new int[N];
// But this one is safe
memset(Array[i], 0, sizeof(int) * N);
}
您的版本正在擦除第一个指针 -- Array[0]
。我把第一个 memset 放在那里,这样你就可以在需要时看到它的样子。这是你需要的第二个。您正在清除 int 的大小乘以您拥有的 int 的数量。