UOJ 145 - 神奇的幻方 - [简单数学题]
Posted tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
数据规模与约定
对于全部数据, 1≤N≤39 且 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("\n"); 35 } 36 }
以上是关于UOJ 145 - 神奇的幻方 - [简单数学题]的主要内容,如果未能解决你的问题,请参考以下文章