奇数阶魔方

描述
一个 n 阶方阵的元素是1,2,...,n^2,它的每行,每列和2条对角线上元素的和相等,这样的方阵叫魔方。n为奇数时我们有1种构造方法,叫做“右上方” ,例如下面给出n=3,5,7时的魔方.
3
8 1 6
3 5 7
4 9 2
5
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
7
30 39 48 1 10 19 28
38 47 7 9 18 27 29
46 6 8 17 26 35 37
5 14 16 25 34 36 45
13 15 24 33 42 44 4
21 23 32 41 43 3 12
22 31 40 49 2 11 20
第1行中间的数总是1,最后1行中间的数是n^2,他的右边是2,从这三个魔方,你可看出“右上方”是何意。 
输入
包含多组数据,首先输入T,表示有T组数据.每组数据1行给出n(3<=n<=19)是奇数。
输出
对于每组数据,输出n阶魔方,每个数占4格,右对齐
样例输入
2
3
5
样例输出
   8   1   6
3 5 7
4 9 2
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

这是一个找规律的题目:

所谓“右上方”就是数字更新的时候总是向右上方递增。从第一行中间位置开始遍历,赋为1. 如果当前位置是第一行(但不是最后一列),那么下一个位置就是下一列的最后一行(正如题目描述中的1之后的2);如果是最后一列(但不是第一行),那么下一个位置就是上一行的第一列;如果不是上述二者,那么判定该位置的“右上方”是否已经遍历过,如果没有,那下一个位置就是该位置的右上方的位置;否则,下一个位置就是同列的下一行的位置;最后,如果当前位置是最右上方,那么下一个位置就是他的同列的下一行。

AC代码为:

 #include<stdio.h>
#include<string.h>
int main()
{
int i,j,n,m,a[][],vis[][],ans;
scanf("%d",&m);
while(m--){
scanf("%d",&n);
memset(a,,sizeof(a));
memset(vis,,sizeof(vis));
i=; /*1总是在第一行*/
j=(n+)/; /*中间那个数*/
ans=; /*从1开始记录*/
while(ans<=n*n) /*1->n^2*/
{
a[i][j]=ans; /*记录当前位置的值*/
vis[i][j]=; /*记录当前位置以更新*/
if(i==&&j!=n) /*第一行不是最后一列*/
{
i=n; /*最后一行*/
j=j+; /*后面一列*/
}
else if(j==n&&i!=) /*最后一列但不是第一行*/
{
i=i-;
j=; /*上一行第一列*/
}
else if(j!=n&&!vis[i-][j+]) /*更新右上角的值*/
{
i=i-;
j=j+; /*右上角*/
}
else if(i!=n&&j!=n&&vis[i-][j+]) /*右上角已更新*/
i=i+; /*跳到同列下一行*/
else if(i==&&j==n) /*最右上角*/
i=i+; /*跳到同列下一行*/
ans++;
}
for(i=;i<=n;i++){
for(j=;j<=n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
}
return ;
}

NYOJ 734的更多相关文章

  1. NYOJ 1007

    在博客NYOJ 998 中已经写过计算欧拉函数的三种方法,这里不再赘述. 本题也是对欧拉函数的应用的考查,不过考查了另外一个数论基本定理:如何用欧拉函数求小于n且与n互质所有的正整数的和. 记eule ...

  2. NYOJ 998

    这道题是欧拉函数的使用,这里简要介绍下欧拉函数. 欧拉函数定义为:对于正整数n,欧拉函数是指不超过n且与n互质的正整数的个数. 欧拉函数的性质:1.设n = p1a1p2a2p3a3p4a4...pk ...

  3. NYOJ 333

    http://www.cppblog.com/RyanWang/archive/2009/07/19/90512.aspx?opt=admin 欧拉函数 E(x)表示比x小的且与x互质的正整数的个数. ...

  4. NYOJ 99单词拼接(有向图的欧拉(回)路)

    /* NYOJ 99单词拼接: 思路:欧拉回路或者欧拉路的搜索! 注意:是有向图的!不要当成无向图,否则在在搜索之前的判断中因为判断有无导致不必要的搜索,以致TLE! 有向图的欧拉路:abs(In[i ...

  5. nyoj 10 skiing 搜索+动归

    整整两天了,都打不开网页,是不是我提交的次数太多了? nyoj 10: #include<stdio.h> #include<string.h> ][],b[][]; int ...

  6. 简答哈希实现 (nyoj 138 找球号2)

    例题链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=138 代码目的:复习哈希用 代码实现: #include "stdio.h&qu ...

  7. nyoj 284 坦克大战 简单搜索

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=284 题意:在一个给定图中,铁墙,河流不可走,砖墙走的话,多花费时间1,问从起点到终点至少 ...

  8. nyoj 170 网络的可靠性

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=170 思路:统计每个节点的度,将度为1的节点消去所需要的最少的边即为答案. 代码: #in ...

  9. nyoj 139 我排第几个--康拓展开

    我排第几个 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 现在有"abcdefghijkl”12个字符,将其所有的排列中按字典序排列,给出任意一种排列,说 ...

随机推荐

  1. C# 时间戳转换为时间方法

            /// <summary>         /// 时间戳转为C#格式时间         /// </summary>         /// <par ...

  2. [翻译] Autoac 最佳实践和建议

    使用嵌套的 ILifetimeScope 解析服务 Autofac 被设计为跟踪(track)和清理(dispose)资源.为确保资源被正确处理,务必将长时间运行的应用程序分成小的工作单元 (请求或事 ...

  3. 装配bean

    spring有三种装配bean的方式:隐式装配.java代码装配.xml装配 隐式装配最为省事方便,也称为自动化装配 这三种装配方式可以混搭着来用 在这里通过一个例子来讲述配置 CD的两个实现,一个是 ...

  4. Java基础学习 -- GUI之 事件处理基础

    事件处理可以简单地这么理解,当有一个事件产生,程序要根据这个事件做出响应.比如,我们做了一个可以通过按钮改变背景颜色的窗口,当我们点击按钮时便产生了一个事件,程序会根据这个事件来做出响应,也就是去改变 ...

  5. Objective-C 快速入门--基础(四)

    1.什么是Block? ① 块语法,本质上是匿名函数(没有名称的函数): ② Block是OC中的一种数据类型,在iOS开发中被广泛使用: ③ ^是Block的特有标记: ④ Block的实现代码包含 ...

  6. Android app被系统kill的场景

    何时发生 当我们的app被切到后台的时候,比如用户按下了home键或者切换到了别的应用,总之是我们的app不再和用户交互了,这个时候对于我们的app来说就是什么事情都可能发生的时候了,因为系统会认为你 ...

  7. 请问utf-8的中文是一个汉字占三个字节长度吗?

    这是个好问题,可以当作一个笔试题.先从字符编码讲起. 1.美国人首先对其英文字符进行了编码,也就是最早的ascii码,用一个字节的低7位来表示英文的128个字符,高1位统一为0: 2.后来欧洲人发现尼 ...

  8. rails中的session

    学rails toturial的时候,第八章一直觉得有点没吃透,后来看了两篇rails关于session和cookies源码分析的文章,cookie原理与实现(rails篇) 和session原理与实 ...

  9. SQL SERVER 2012/2014 链接到 SQL SERVER 2000的各种坑

    本文总结一下SQL SERVER 2012/2014链接到SQL SERVER 2000的各种坑,都是在实际应用中遇到的疑难杂症.可能会有人说怎么还在用SQL SERVER 2000,为什么不升级呢? ...

  10. WebAPi的可视化输出模式(RabbitMQ、消息补偿相关)——所有webapi似乎都缺失的一个功能

    最近的工作我在做一个有关于消息发送和接受封装工作.大概流程是这样的,消息中间件是采用rabbitmq,为了保证消息的绝对无丢失,我们需要在发送和接受前对消息进行DB落地.在发送前我会先进行DB的插入, ...