东方14模拟赛之noip2015/day1/3/神奇的幻方

总时间限制: 
10000ms

单个测试点时间限制: 
1000ms

内存限制: 
128000kB
描述

幻方是一种很神奇的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)的右上方,否则将K填在 (K−1) 的正下方

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

输入
输入文件只有一行,包含一个整数N,即幻方的大小。
输出
输出文件包含N行,每行N个整数,即按上述方法构造出的N*N的幻方。相邻 两个整数之间用单个空格隔开。
样例输入
3
样例输出
8 1 6
3 5 7
4 9 2
提示
对于 100% 的数据,1 ≤N≤39 且N为奇数。
来源
noip2015day1第一题
模拟

#include<bits/stdc++.h>
using namespace std;
int hf[50][50]= {0};
int k,i,j,n,dx,dy;
int main() {
    cin>>n;
    k=1;
    dx=1;
    dy=n/2+1;
    hf[dx][dy]=k;
    for(k=2; k<=n*n; k++) {
        if(dx==1&dy!=n) {
            dx=n;
            dy++;
        } else if(dx!=1&&dy==n) {
            dy=1;
            dx--;
        } else if(dx==1&&dy==n) dx++;
        else if(dx!=1&&dy!=n) {
            if (hf[dx-1][dy+1]==0&&(dx-1>0&&dy+1<=n)) {
                dx--;
                dy++;
            } else dx++;
        }
        hf[dx][dy]=k;
    }
    for(i=1; i<=n; i++) {
        for(j=1; j<=n; j++)cout<<hf[i][j]<<‘ ‘;
        cout<<endl;
    }
    return 0;
}

时间: 2024-10-10 23:10:29

东方14模拟赛之noip2015/day1/3/神奇的幻方的相关文章

东方14模拟赛之岛屿

02:岛屿 查看 提交 统计 提问 总时间限制:  40000ms 单个测试点时间限制:  4000ms 内存限制:  128000kB 描述 从前有一座岛屿,这座岛屿是一个长方形,被划为N*M的方格区域,每个区域都有一个确定的高度.不幸的是海平面开始上涨,在第i年,海平面的高度为t[i].如果一个区域的高度小于等于海平面高度,则视为被淹没.那些没有被淹没的连通的区域够成一个连通块.现在问第i年,这样的连通块有多少个. 例如:第一年海平面高度为1,有2个连通块. 第二年海平面高度为2,有3个连通

9.14 模拟赛

模拟赛第三弹~ T1 题意:给你一个数列,要求删掉任意一种整数,使得剩下的新数列中连续的相等的数最多 例如 2 7 3 7 7 3 3 7 7 5 7,删掉3以后剩的7有四个连续的,最多 思路:暴力枚举去掉哪个......这算是一道水题吧 代码丢了...... TAT T2 题意:有n本书,每本书有宽度和高度.现在你有无数个书架,每个书架的宽度为w,高度由最高的书决定 问在书本按顺序放的情况下,总的书架高度最小是多少 思路:dp,dp[i]表示做到第i本书时的最小高度和. 每次先找到能以编号j的

2015年 day1.1 神奇的幻方

神奇的幻方 题目描述 幻方是一种很神奇的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填

9.14模拟赛

T1  COGS2524评测 题目描述 从1-N1?N中找一些数乘起来使得答案是一个完全平方数,求这个完全平方数最大可能是多少. 输入输出格式 输入格式: 第一行一个数字NN. 输出格式: 一行一个整数代表答案对100000007100000007取模之后的答案. 输入输出样例 输入样例#1: 7 输出样例#1: 144 说明 对于20\%20%的数据,1 \leq N \leq 1001≤N≤100. 对于50\%50%的数据,1 \leq N \leq 50001≤N≤5000. 对于70\

9.14——模拟赛

T1 仙 临江仙 旧梦  (Topcoder SRM 703 div2 500pts) 题目背景闻道故园花陌,今年奼紫嫣红.扬帆直渡水千重.东君何解意,送我一江风.还是昔时庭院,终得醉卧花丛.残更惊醒月明中.流光如旧岁,多少梦成空.题目描述#define goodcatdog gcd#define important i#define judge j神说 每个梦想就是一轮月亮,高高地孤寂地挂在清冷的夜空.为了让月亮不再孤独,灯神给她找了好多好多伴儿.现在天空上就有n轮月亮啦!月亮在天上跟相邻的伙

[铁一中OI模拟赛]2017.8.19 Day1

T1 小Z的情书 题目链接 思考: 题目主要难度在于旋转后的位置如何,在手写了样例之后不难发现规律. #include <cstdio> #include <cstring> #define up(a,b,c) for(register int c=a;c<=b;++c) #define down(a,b,c) for(register int c=a;c>=b;--c) const int Maxn=1005; int n; bool Map[Maxn][Maxn],

NOI模拟赛 Day1

[考完试不想说话系列] 他们都会做呢QAQ 我毛线也不会呢QAQ 悲伤ING 考试问题: 1.感觉不是很清醒,有点困╯﹏╰ 2.为啥总不按照计划来!!! 3.脑洞在哪里 4.把模拟赛当作真正的比赛,紧张起来!!! 好了不扯淡了...

【BZOJ】【2741】【FOTILE模拟赛】L

可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成[某个区间中 max(两个数的异或和)] 要是我们能将所有[l,r]的答案都预处理出来,那么我们就可以O(1)回答了:然而我们并不能. 一个常见的折中方案:分块! 这里先假设我们实现了一个神奇的函数ask(l,r,x),可以帮我们求出[l,r]这个区间中的数,与x最大的异或值. 我们不预处理所有的左端点,我

10.30 NFLS-NOIP模拟赛 解题报告

总结:今天去了NOIP模拟赛,其实是几道USACO的经典的题目,第一题和最后一题都有思路,第二题是我一开始写了个spfa,写了一半中途发现应该是矩阵乘法,然后没做完,然后就没有然后了!第二题的暴力都没码QAQ 现在我来写解题报告了,有点饿了QAQ.. 第一题 题目 1: 架设电话线 [Jeffrey Wang, 2007] 最近,Farmer John的奶牛们越来越不满于牛棚里一塌糊涂的电话服务,于 是,她们要求FJ把那些老旧的电话线换成性能更好的新电话线.新的电话线架设 在已有的N(2 <=