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

摘要:
在我的记忆中,我最早遇到的、最让我着迷的魔术方块绝对是前三名。所以,当我整理旧书时,当我看到魔术方块时,我的头脑发热了,我说我会这样做。首先是魔术方块的起源,一个非常精彩的故事。魔术方块。尽管发现规则的过程对小学生来说可能并不顺利,但任何人都不难产生规则为0的幻方//判断有数{m=m+2;n=n-1;num[m][n]=i;}Elseif//判断右上角{m=m+2;n=n-1;num[m][n]=i;}Else//填写{num[m][n]=i;}}在{for{cout˂˂num[m][n]˂˂“”;}的通用性右上角cout˂˂endl;}}奇幻方(通用公式)实现:#include<iostream>usingspacestd;Intmain(){intk;cout˂˂“您想要得到的魔术方块顺序是:”˂˃k;intnum[99][99]={0};intm=0;intn=(k-1)/2;num[0][(k-1)/2]=1;对于{m-;n++;如果(m==-1&&n!

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

  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] << "	";
		}
		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] << "	";
		}
		cout << endl;
	}

}

免责声明:文章转载自《C++奇数阶幻方(主动生成)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇pyqt 实现左列表向右列表添加【Azure 应用服务】一个 App Service 同时部署运行两个及多个 Java 应用程序(Jar包)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章