OPENJUDGE 1.8 22:神奇的幻方
来源:互联网 发布:微信里的淘宝链接 编辑:程序博客网 时间:2024/05/18 16:37
22:神奇的幻方 (从OPENJUDGE引入)
查看
描述
幻方是一个很神奇的N*N矩阵,它的每行、每列与对角线,加起来的数字和都是相同的。
我们可以通过以下方法构建一个幻方。(阶数为奇数)
1.第一个数字写在第一行的中间
2.下一个数字,都写在上一个数字的右上方:
a.如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列
b.如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行
c.如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方
输入
一个数字N(N<=20)
输出
按上方法构造的2N-1 * 2N-1的幻方
样例输入
3
样例输出
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
题目分析:
幻方的构造题目已经给出,难点在于当右上角有数时的情况。判断有无数的方法就是将数组归零,元素若为“0”则无数,之后将两种情况分类讨论。
程序样例:
#include<cstdio>int main(){ int N,hf[41][41]={},tot=1; //tot为计数单位 scanf("%d",&N); N=2*N-1; //构造(2N-1)*(2N-1)的幻方 int i=1,j=(N-1)/2; while(tot<=N*N) //遍历每一个元素 { int m,n; m=i-1>=0? i-1:N-1; n=j; if(!hf[m][n]) //无数 { hf[m][n]=tot; i--; j++; } else //有数 { m=i+1; //降一排 if(m>=N) m=0; n--; //退一列 if(n<0) n=N-1; hf[m][n]=tot; i++; } if(i<0) i=N-1; if(j>=N) j=0; tot++; } for(int i=0;i<N;i++) { if(i) //换行符格式控制 printf("\n"); for(int j=0;j<N;j++) if(j) //空格格式控制 printf(" %d",hf[i][j]); else printf("%d",hf[i][j]); } return 0;}
0 0
- openjudge.1.8.22 神奇的幻方
- OPENJUDGE 1.8 22:神奇的幻方
- openjudge 神奇的幻方
- 22:神奇的幻方
- 22:神奇的幻方
- openjudge 数算练习 线性表 0217:神奇的幻方
- 神奇的幻方
- 神奇的幻方
- 神奇的幻方
- 神奇的幻方
- 【NOIP2015】神奇的幻方
- 【NOIP2015】神奇的幻方
- [noip2015tg] 神奇的幻方
- oj神奇的幻方
- 计蒜客-神奇的幻方
- noip2015神奇的幻方
- 百练noi 22:神奇的幻方
- 二维数组练习22_神奇的幻方
- 命令方式对Oracle数据库导入导出
- 求两个数的最小公倍数 比如输入2 3 输出6
- 优达学城优惠码 71C8FB5A
- 小小明_小小明手游框架_xxm_小小明手游平台
- VS Code 折腾记 - (5) Angular 2+ && Typescript 2 + 必备插件推荐
- OPENJUDGE 1.8 22:神奇的幻方
- LeetCode OJ题解系列
- Socket网络编程
- Android编程
- LeetCode题解-1-Two Sum
- ZOJ 2976Light Bulbs
- biee 12c 修改weblogic用户密码
- 用linux进行简单进度条编辑
- grep 用法