zoukankan      html  css  js  c++  java
  • UOJ 145

    题目链接:http://uoj.ac/problem/145

    题目描述

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

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

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

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

    1.若 (K−1) 在第一行但不在最后一列,则将 K 填在最后一行, (K−1) 所在列的右一列;

    2.若 (K−1) 在最后一列但不在第一行,则将 K 填在第一列, (K−1) 所在行的上一行;

    3.若 (K−1) 在第一行最后一列,则将 K 填在 (K−1) 的正下方;

    4.若 (K−1) 既不在第一行,也最后一列,如果 (K−1) 的右上方还未填数,则将 K 填在 (K−1) 的右上方,否则将 L 填在 (K−1) 的正下方。

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

    输入格式

    输入文件只有一行,包含一个正整数 N ,即幻方的大小。

    输出格式

    输出文件包含 N 行 ,每行 N 个整数,即按上述方法构造出的 N∗N 的幻方,相邻两个整数之间用单空格隔开。

    样例一

    input

    3
    

    output

    8 1 6
    3 5 7
    4 9 2
    

    数据规模与约定

    对于全部数据, 1N39 且 N 为奇数。

    时间限制:1s

    空间限制:128MB

    题解:直接按照题目给的填数方式模拟即可。

    AC代码:

     1 #include<cstdio>
     2 #include<cstring>
     3 int n,mp[43][43];
     4 struct point{
     5     int x,y;
     6 }now,nex;
     7 int cnt;
     8 int main()
     9 {
    10     memset(mp,0,sizeof(mp));
    11     scanf("%d",&n);
    12     now.x=1, now.y=(n+1)/2, cnt=1;
    13     while(cnt<=(n*n))
    14     {
    15         mp[now.x][now.y]=cnt;
    16         nex.x=(now.x-1==0)?(n):(now.x-1);
    17         nex.y=(now.y+1==n+1)?(1):(now.y+1);
    18         if(mp[nex.x][nex.y])
    19         {
    20             nex.x=(now.x+1==n+1)?(1):(now.x+1);
    21             nex.y=now.y;
    22         }
    23 
    24         now.x=nex.x, now.y=nex.y;
    25         cnt++;
    26     }
    27     for(int i=1;i<=n;i++)
    28     {
    29         for(int j=1;j<=n;j++)
    30         {
    31             printf("%d",mp[i][j]);
    32             if(j!=n) printf(" ");
    33         }
    34         printf("
    ");
    35     }
    36 }
  • 相关阅读:
    代码4
    readline,readlines,read函数
    代码3
    find函数
    字典的循环和if语句
    代码2
    代码1
    python除法
    字符串
    print函数
  • 原文地址:https://www.cnblogs.com/dilthey/p/7628795.html
Copyright © 2011-2022 走看看