zoukankan      html  css  js  c++  java
  • 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] << "	";
    		}
    		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;
    	}
    
    }
    
  • 相关阅读:
    pix-PID介绍
    我的四轴专用PID参数整定方法及原理---超长文慎入(转)
    卡尔曼滤波原理
    5种常用的四轴飞行器PID算法讲解集合
    深入浅出无人机姿态,欧拉角,四元数,指数表示及数据转换与程序实现
    理解四元数
    Normal Equation(正规方程)
    特征与多项式回归
    实际梯度下降中的两个重要调节方面
    BZOJ 3624 Apio2008 免费道路
  • 原文地址:https://www.cnblogs.com/xiaotian66/p/13257198.html
Copyright © 2011-2022 走看看