PS:大家可以先看看之前的n阶幻方,现在是进阶了
如图,有这样的一个魔方,1放在第一行的中间位置,随后输入1~n²
放置要求:
1.下一个数字放在上一个数字的上一行右一列
2.若下一个数字被占了位置,则放在下一行
3.若到了右边界,那么到左边的第一列
4.若到了上边界,那么到最后一行
先上代码(头文件的代码):
#pragma once
#include<iostream>
using namespace std;
class Migic
{
public:
void Init(int n) {
//魔术方阵初始化:
radix = n;
data = new int[radix * radix];
for (int i = 0; i < radix; i++)
{
for (int j = 0; j < radix; j++)
{
data[i * radix + j] = -1;
}
}
work();
}
void output() {
//输出n阶魔术方阵:
cout << radix << "阶魔术方阵" << endl;
for (int i = 0; i < radix; i++)
{
for (int j = 0; j < radix; j++) {
cout << data[i * radix + j] << "\t";
}
cout << endl << endl;
}
delete[]data;
}
private:
int radix;
int* data;//动态数组
void work() {
//生成魔术方阵
int row = 0;//行号
int col = radix / 2;//列号
for (int num = 1; num <= radix * radix; num++) {
//存入数组
data[row * radix + col] = num;
//下一个位置
row = (row - 1 + radix) % radix;
col = (col - 1 + radix) % radix;
//位置被占
if (data[row * radix + col] != -1) {
row = (row + 1 + 1) % radix;
col = (col + 1) % radix;
}
}
}
};
再看cpp文件的代码:
#include<iostream>
#include"magic.h"
using namespace std;
int main()
{
int n;
cout << "请输入一个大于等于3的奇数" << endl;
cin >> n;
Migic a;
a.Init(n);
a.output();
return 0;
}
PS:有人会疑问,为什么看不到二维数组,因为二维数组其实是在一块连续的空间存放的,本质是一维数组,它们之间有转化:
所以,问题不大,本质都是可以互相转化的。