题目部分

题目来源:洛谷p2615

题目描述

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

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

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

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

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

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

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

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

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

输入输出格式

输入格式:

一个正整数 N,即幻方的大小。

输出格式:

共 N 行 ,每行 N 个整数,即按上述方法构造出的 N*N 的幻方,相邻两个整数之间用单空格隔开。

输入输出样例

输入样例#1:

3

输出样例#1:

8 1 6

3 5 7

4 9 2

说明

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

NOIp2015 提高组 d1t1

讲解部分

我的大致思路如下,就是模拟,首先定义一个结构体,结构体存的是各个点的横坐标和纵坐标,然后再新建一个mapp的二维数组,用来储存幻方的点的信息,通过判断进行修改操作,最后直接输出mapp数组即可。

需要注意的是存答案的时候注意横列的加减及方向不要弄错。

代码实现

代码中的注释写的也很清楚,不懂得可以问我。

#include<bits/stdc++.h>
using namespace std;
int N;int k=1;
int mapp[41][41];//数组用来存幻方的答案
struct NODE
{
int x,y;
};
NODE node[1600];//结构体用来存点的横坐标和纵坐标信息
inline void write(int x)
{
if(x<0)
{
putchar('-');
x=-x;
}
if(x>9) write(x/10);
putchar(x%10+'0');
return;
}//输出优化
inline void solve()
{
if(node[k-1].y==1&&node[k-1].x!=N)//判断是否符合第一个条件
{
node[k].y=N;
node[k].x=(node[k-1].x+1);//储存k点横纵坐标
mapp[N][node[k].x]=k;//存答案
}
if(node[k-1].x==N&&node[k-1].y!=1)//判断是否符合第二个条件
{
node[k].x=1;
node[k].y=(node[k-1].y-1);//储存k点横纵坐标
mapp[node[k].y][1]=k;//存答案
}
if(node[k-1].y==1&&node[k-1].x==N)//判断是否符合第三个条件
{
node[k].x=node[k-1].x;
node[k].y=(node[k-1].y+1);//储存k点横纵坐标
mapp[node[k].y][node[k].x]=k;//存答案
}
if(node[k-1].y!=1&&node[k-1].x!=N)//判断是否符合第四个条件
{
if(mapp[node[k-1].y-1][node[k-1].x+1]==0x3f3f3f3f)//判断k-1点的右上方是否存过答案
{
node[k].x=node[k-1].x+1;
node[k].y=node[k-1].y-1;//储存k点横纵坐标
mapp[node[k].y][node[k].x]=k;//存答案
}
else
{
node[k].x=node[k-1].x;
node[k].y=node[k-1].y+1;//储存k点横纵坐标
mapp[node[k].y][node[k].x]=k;//存答案
}
}
}
int main()
{
cin>>N;
memset(mapp,0x3f,sizeof(mapp));//初始化mapp数组为无穷大,之后用来判断第四个操作k-1点右上方是否填过数字
node[k].x=(N+1)/2;
node[k].y=1;//储存第一个点的横纵坐标信息
mapp[1][(N+1)/2]=k;//写入答案
k++;//为下一个点操作做准备
for(;k<=N*N;k++)//一共有N行,所以有N*N个点,要处理N*N次
{
solve();//处理
}
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
{
write(mapp[i][j]);//输出答案
printf(" ");
}
printf("\n");
}
return 0;
}

luogu p2615神奇的幻方题解的更多相关文章

  1. 洛谷 P2615 神奇的幻方 题解

    每日一题系列day1 打卡 Analysis 水货模拟,不多说了 #include<iostream> #include<cstdio> #include<cstring ...

  2. P2615 神奇的幻方

    P2615 神奇的幻方 题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首 ...

  3. 洛谷 P2615 神奇的幻方

    传送门 I'm here! 思路 这个题,我们可以直接去模拟,因为范围很小,且\(N\)都是奇数 直接构造一个矩阵,初始值都为\(0\),然后\(while\)循环,根据题目给出的\(4\)个条件进行 ...

  4. 洛谷——P2615 神奇的幻方 【Noip2015 day1t1】

    https://www.luogu.org/problem/show?pid=2615 题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之 ...

  5. [NOIP2015] 提高组 洛谷P2615 神奇的幻方

    题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...

  6. 洛谷 P2615 神奇的幻方 —— 模拟

    题目:https://www.luogu.org/problemnew/show/P2615 直接按题意模拟即可; 用 Emacs 做的第一道题! 代码如下: #include<iostream ...

  7. 2015 NOIP day1 t1 神奇的幻方 模拟

    神奇的幻方 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.luogu.org/problem/show?pid=2615 Descri ...

  8. noip2015day1 T1 4510 神奇的幻方

    4510 神奇的幻方 noip2015day1 T1  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descripti ...

  9. NOIP2015 D1T1 神奇的幻方

    洛谷P2615 很简单的模拟题……每枚举一个点只要保存上一个点的x,y值即可,不用开数组存放 另外题目中对于K的操作都在K-1的九宫格范围内,所以我们巧妙运用++和--就可以做到每个分支一行代码 还有 ...

随机推荐

  1. 04.Continue,和三元表达式的学习

    立即结束本次循环,判断循环条件,如果成立,则进入下一次循环,否则退出循环. 举例:运动员跑步喝水的例子 比如:我编写代码的时候,上个厕所,回来继续写代码 练习1: namespace _09.练习02 ...

  2. C#学习笔记7

    1.重写GetHashCode方法注意点: (1)重写GetHashCode方法,也应重写Equals方法,否者编译器会警告. (2)相等的对象必须有相等的散列码(若a.Equals(b),则a.Ge ...

  3. Cocos2d-js 开发记录-初始

    GameDev标签很早就建了,现在终于可以往里面添加第一篇文章了. 最近和朋友在做几个小游戏,就是微信社交中的那些有点2的游戏,我自己也觉得有点傻,不过先从小的做起,平时想想挺简单的事情,一旦自己真做 ...

  4. Nodejs介绍及npm工具使用

    一.Nodejs介绍 Nodejs英文网:https://nodejs.org/en/ Nodejs中文网:http://nodejs.cn/ Node.js 是一个基于 Chrome V8 引擎的 ...

  5. xcode选择开发者时"The Apple Developer Program License Agreement has been updated"

    解决方法:进入开发者中心查看红色提示信息,同意就行

  6. Azure进阶攻略丨Azure网络通不通,PsPing&PaPing告诉你答案

    很多时候,为了解决一些问题,要查各种文档,很麻烦你造吗!做「伸手党」又容易被鄙视,这时候就需要用到[Azure 进阶攻略]啦!特此,我们推出关于 Azure 常用操作指南的系列文章,每篇涉及一个 Az ...

  7. Angular5+ 自定义表单验证器

    Angular5+ 自定义表单验证器 Custom Validators 标签(空格分隔): Angular 首先阐述一下遇到的问题: 怎样实现"再次输入密码"的验证(两个cont ...

  8. Angular项目新建

    Angular新建项目步骤记录 标签(空格分隔): Angular 1. ng new my-app 2. 启动dev环境 cd my-app ng serve --open 3. 修改styles. ...

  9. vs2010开发链接服务器出现错误(SourceSafe)

    用vs2010开发项目链接服务器时出现 之前是因为权限问题,每次打开项目文件时 ,都要先直接进服务器然后打开项目. 用了两天,又不行了.就这个问题已经问了了老大不下3次了. 其实很是不想再麻烦他老人家 ...

  10. June 04th 2017 Week 23rd Sunday

    It is not the mountain we conquer but outselves. 我们要征服的不是高山,而是我们自己. After days of hard working, I sl ...