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:有人会疑问,为什么看不到二维数组,因为二维数组其实是在一块连续的空间存放的,本质是一维数组,它们之间有转化:
所以,问题不大,本质都是可以互相转化的。