C++奇数阶幻方(主动生成)

  当初小学时,我非常地痴迷奥数。在我记忆里边,我遇到得最早,最让我痴迷的,幻方绝对是排在了前三位。
  还记得那是四年级(哈哈,这个年龄真不算早,但那种对于奥数的感情,绝对是最纯真的热爱)我接触到神奇的幻方,然后自己鼓捣,找到了幻方的规律,就是这篇博客所用到的。所以,当我整理自己的旧书时,看到幻方,脑子一热,说干就干。
  首先是幻方的起源,一段非常奇妙的故事。大约两千多年前西汉时代,流传夏禹治水时,黄河中跃出一匹神马,马背上驮着一幅图,人称「河图」;又洛水河中浮出一只神龟,龟背上有一张象征吉祥的图案称为「洛书」。“河出图,洛出书,圣人则之。”
  说到这里,我又想起来了华为的“河图”,每个时代都会需要一些创作来证明它的存在,只不过,创作的人不一样罢了。
  幻方,虽然发现规律的过程可能对于一个小学生而言并不顺利,但是拿着规律去产出幻方对于任何人来说都不困难。
  算法思想:

  1. 从第一行的最中心开始填1,依次向右上移动填写下一个数。
  2. 如果从上方超出,则移动到最下面一格填写;
  3. 如果从右方超出,则移动到最左边一格填写;
  4. 如果右上方有数,或是右上顶角,则移动到相对下方的一格填写;
    (抱歉,现在我没学会用电脑画幻方方格图)

三阶幻方填写的实现:

#include<iostream>
using namespace std;
int main()
{
	int num[3][3] = { 0 };
	int m = 0;
	int n = 1;
	num[0][1] = 1;
	for (int i = 2; i <= 9; i++)
	{
		m--;
		n++;
		if (m == -1&&n!=3)//判上出界
		{
			m = m + 3;
			num[m][n] = i;
		}
		else if(n==3&&m!=-1)//判右出界
		{
			n = n - 3;
			num[m][n] = i;
		}
		else if (num[m][n] != 0)//判右上有数
		{
			m = m + 2;
			n = n - 1;
			num[m][n] = i;
		}
		else if (m == -1 && n == 3)//判右上顶角
		{
			m = m + 2;
			n = n - 1;
			num[m][n] = i;
		}
		else//通性右上填写
		{
			num[m][n] = i;
		}
	}

	for (m = 0; m <= 2; m++)
	{
		for (n = 0; n <= 2; n++)
		{
			cout << num[m][n] << "\t";
		}
		cout << endl;
	}

}

就是这样(3x3幻方)
奇数阶幻方(通式)实现:

#include<iostream>
using namespace std;
int main()
{
	int k;
	cout << "你希望得到的幻方阶数是(<=99):" << endl;
	cin >> k;
	int num[99][99] = { 0 };
	int m = 0;
	int n = (k-1)/2;
	num[0][(k-1)/2] = 1;
	for (int i = 2; i <= k*k; i++)
	{
		m--;
		n++;
		if (m == -1 && n != k)//判上
		{
			m = m + k;
			num[m][n] = i;
		}
		else if (n == k && m != -1)//判右
		{
			n = n - k;
			num[m][n] = i;
		}
		else if (m == -1 && n == k)//判右上顶角
		{
			m = m + 2;
			n = n - 1;
			num[m][n] = i;
		}
		else if (num[m][n] != 0)//判右上有数
		{
			m = m + 2;
			n = n - 1;
			num[m][n] = i;
		}
		else//通性右上
		{
			num[m][n] = i;
		}
	}

	for (m = 0; m <k; m++)//输出
	{
		for (n = 0; n <k; n++)
		{
			cout << num[m][n] << "\t";
		}
		cout << endl;
	}

}
  • 16
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值