• 神奇的幻方


    幻方是一种很神奇的 N*NNN 矩阵:它由数字 1,2,3,cdots cdots ,N imes N1,2,3,,N×N 构成,且每行、每列及两条对角线上的数字之和都相同。

    当 NN 为奇数时,我们可以通过下方法构建一个幻方:

    首先将 11 写在第一行的中间。

    之后,按如下方式从小到大依次填写每个数 K (K=2,3,cdots,N imes N)K(K=2,3,,N×N) :

    1. 若 (K-1)(K1) 在第一行但不在最后一列,则将 KK 填在最后一行, (K-1)(K1) 所在列的右一列;
    2. 若 (K-1)(K1) 在最后一列但不在第一行,则将 KK 填在第一列, (K-1)(K1) 所在行的上一行;
    3. 若 (K-1)(K1) 在第一行最后一列,则将 KK 填在 (K-1)(K1) 的正下方;
    4. 若 (K-1)(K1) 既不在第一行,也最后一列,如果 (K-1)(K1) 的右上方还未填数,则将 KK 填在 (K-1)(K1) 的右上方,否则将 LL 填在 (K-1)(K1) 的正下方。

    现给定 NN ,请按上述方法构造 N imes NN×N 的幻方。

    输入输出格式

    输入格式:

    一个正整数 NN ,即幻方的大小。

    输出格式:

    共 NN 行 ,每行 NN 个整数,即按上述方法构造出的 N imes NN×N 的幻方,相邻两个整数之间用单空格隔开。

    #include<bits/stdc++.h>
    using namespace std;
    int n,a[40][40],x,y;
    int main(){
    	//freopen("magic.in","r",stdin);
    	//freopen("magic.out","w",stdout);
    	scanf("%d",&n);
    	a[1][n/2+1]=1;
    	x=1,y=n/2+1;
    	for(int i=2;i<=n*n;i++)
    	{
    		if(x==1&&y!=n)
    			x=n,y+=1;
    		else if(x!=1&y==n)
    		x-=1,y=1;
    		else if(x==1&&y==n)
    		x+=1;
    		else if(x!=1&&y!=n)
    		{
    			if(a[x-1][y+1]==0)
    			x-=1,y+=1;
    			else
    			x+=1;
    		}
    		a[x][y]=i;
    	}
    	for(int i=1;i<=n;i++)
    	{
    		int k=0;
    		for(int j=1;j<=n;j++)
    	{
    		if(k==0)
    		{
    			printf("%d",a[i][j]);
    			k=1;
    		}
    		else
    		printf(" %d",a[i][j]);
    	}
    	printf("
    ");
    	}
    	return 0;
    }

    题解:

    一道简单的模拟题,按照要求水一下就可以了,轻松愉快!!!

  • 相关阅读:
    Eureka 原理圖
    RabbitMQ 介紹
    rabbitmq-3.5.1-安裝
    MyBatis 基础入门
    CSS
    程序员必会算法-KMP算法
    编程这些年
    排序算法之直接插入排序
    排序算法之选择排序
    排序算法之冒泡排序
  • 原文地址:https://www.cnblogs.com/xxmxxm/p/11152113.html
Copyright © 2020-2023  润新知