• 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;
    	}
    
    }
    
  • 相关阅读:
    [转] Akka实战:构建REST风格的微服务
    [转] Node.js的线程和进程
    [转] Spring Integration 系统集成
    NodeJS使用SSL证书
    Tomcat SSL证书安装配置
    [转]【NODE】用WS模块创建加密的WS服务(WSS)
    [转] Spring Boot实战之Filter实现使用JWT进行接口认证
    [转] 前后端分离之JWT用户认证
    [转] 使用 Java8 Optional 的正确姿势
    [转] SpringBoot RESTful 应用中的异常处理小结
  • 原文地址:https://www.cnblogs.com/xiaotian66/p/13257198.html
Copyright © 2020-2023  润新知