「EJOI2017」-骆驼
第一道构造题祭……
文字叙述:
题目的提示很明显。
$N$是$5$的倍数,所以考虑分成$5 \times 5$小块连在一起。
首先通过打表证明,
小块里从任何一点出发,经过所有的格,从任一一点跳出,一定有这样的路径。
那么因为此题$spj$,所以只要想方设法构造出一种可行解就$OK$辣。
所以我们把大的棋盘分成很多小块,并把小块连在一起。
要分奇偶连接。
在连接时要尽量横竖移动,这样优化代码复杂度。
给出我的连接方案:

当然,你这样连也是可以的(加油):

我们给一个小块内的格设置一个连通参数,即一步可以跳到的其他块数。
有:

发现如果选择$(3,3)$点会很优。
于是……(学会偷懒,写函数!)
我们把向四个方向的块,奇数起点,奇数起点右下点,偶数起点预处理(共$7$个)
如果想要更清楚的往下看:
偶数的起点:

最后从右面返回。
奇数的起点和右下的终点接口:

向右走(左面的块方向定义为向右)「向左同理」:

向下走(上面的块方向定义为向下)「向上同理」:

码一下就好了~~
#include <iostream>
#include <cstring>
#include <cstdio>
#define L 1111
#define N 222
#define JST 0
#define JJK 1
#define OST 2
#define DOWN 3
#define UP 4
#define LEFT 5
#define RIGHT 6
using namespace std;
const int stdsq[7][5][5]={
{
{ 1, 8,16, 2, 7},
{11,19, 5,10,18},
{22,14, 0,21,15},
{ 4, 9,17, 3, 6},
{12,20,23,13, 0}
},
{
{22, 3, 9,23, 2},
{16,25,20,17, 7},
{10,13, 1, 4,12},
{21,18, 8,24,19},
{15, 5,11,14, 6}
},
{
{ 1,12, 5, 2,13},
{ 7,18,15,10,19},
{23, 3, 0,22, 4},
{16,11, 6,17,14},
{ 8,21,24, 9,20}
},
{
{ 6,22,14, 7, 2},
{19, 9, 4,20,12},
{24,16, 1,23,15},
{ 5,21,13, 8, 3},
{18,10,25,17,11}
},
{
{ 9,22,25, 8, 2},
{17,12, 4,20,15},
{24, 7, 1,23, 6},
{10,21,16,11, 3},
{18,13, 5,19,14}
},
{
{ 9,17,24, 8, 2},
{22,12, 4,19,13},
{25, 7, 1,16, 6},
{10,18,23,11, 3},
{21,15, 5,20,14}
},
{
{22,14, 7,23, 2},
{ 9,19, 4,12,18},
{ 6,24, 1,15,25},
{21,13, 8,20, 3},
{10,16, 5,11,17}
}
};
int ans[L][L],len,bn;
struct Fivesq{
int id,addup;
void update(const int x,const int y){
for(int i=0;i<5;i++)
for(int j=0;j<5;j++)
ans[x+i][y+j]=stdsq[id][i][j]+addup;
}
};
Fivesq mp[N][N];
void set(int li,int f,int t,int val){
for(int i=f;i<=t;i++)
mp[li][i].id=val;
}
void search(int x,int y,const int lsv){
int val=lsv;
while(mp[x][y].id!=JST \
&&mp[x][y].id!=JJK \
&&mp[x][y].id!=OST){
//cout<<x<<" "<<y<<" "<<mp[x][y].id<<endl;
mp[x][y].addup=val;
val+=25;
if(mp[x][y].id==UP )x--;
else if(mp[x][y].id==DOWN )x++;
else if(mp[x][y].id==LEFT )y--;
else if(mp[x][y].id==RIGHT)y++;
}
if(mp[x][y].id==JJK){
mp[x][y].addup=val;
}
}
int main(){
scanf("%d",&len);
if(len==5){
puts("1 14 7 4 15\n9 22 17 12 23 \n19 5 25 20 6\n2 13 8 3 16 \n10 21 18 11 24");
return 0;
}
bn=len/5;
if(bn&1){
mp[0][0].id=JST;
mp[1][1].id=JJK;
for(int i=1;i<bn;i++){
if(i&1)mp[0][i].id=DOWN;
else mp[0][i].id=LEFT;
}
for(int i=2;i<bn;i++){
if(i&1)mp[1][i].id=LEFT;
else mp[1][i].id=UP;
}
for(int i=1;i<bn;i++)
mp[i][0].id=DOWN;
mp[bn-1][0].id=RIGHT;
for(int i=2;i<bn;i++){
if(i&1){
set(i,1,bn-1,LEFT);
mp[i][1].id=UP;
}
else{
set(i,1,bn-1,RIGHT);
mp[i][bn-1].id=UP;
}
}
search(1,0,23);
for(int i=0;i<bn;i++)
for(int j=0;j<bn;j++)
mp[i][j].update(i*5,j*5);
ans[2][2]=len*len;
ans[4][4]=len*len-1;
}
else{
mp[0][0].id=OST;
for(int i=1;i<bn;i++)
mp[i][0].id=DOWN;
mp[bn-1][0].id=RIGHT;
set(0,1,bn-1,LEFT);
for(int i=1;i<bn;i++){
if(i&1){
set(i,1,bn-1,RIGHT);
mp[i][bn-1].id=UP;
}
else{
set(i,1,bn-1,LEFT);
mp[i][1].id=UP;
}
}
/*for(int i=0;i<bn;i++){
for(int j=0;j<bn;j++){
printf("%d ",mp[i][j].id);
}puts("");
}*/
search(1,0,24);
for(int i=0;i<bn;i++)
for(int j=0;j<bn;j++)
mp[i][j].update(i*5,j*5);
ans[2][2]=len*len;
}
for(int i=0;i<len;i++){
for(int j=0;j<len;j++){
printf("%d ",ans[i][j]);
}puts("");
}
}
「EJOI2017」-骆驼的更多相关文章
- 「译」JUnit 5 系列:条件测试
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
- 「译」JUnit 5 系列:扩展模型(Extension Model)
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
- JavaScript OOP 之「创建对象」
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
- 「C++」理解智能指针
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
- 「JavaScript」四种跨域方式详解
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
- 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
- 「2014-3-18」multi-pattern string match using aho-corasick
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
- 「2014-3-17」C pointer again …
记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...
- 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance
提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...
随机推荐
- 树形dp经典换根法——cf1187E
假设以u为根时结果是tot,现在转换到了以u的儿子v为根,那么结果变成了tot-size[v]+(sizetot-size[v]) 根据这个转移方程,先求出以1为根的tot,然后dfs一次转移即可 # ...
- java8 list、map遍历以及反射
//新建list List<User> userList = new ArrayList<>(); User user = new User(); user.setId(&qu ...
- ThinkPHP 的缓存大概多久更新一次
ThinkPHP 的缓存大概多久更新一次可以自己设置: thinkPHP的缓存默认是文件缓存,保存在Runtime文件夹里面, 如果不设置过期时间,且不清除Runtime文件,就会一直存在. 如果设置 ...
- Http学习(一)
HTTP 超文本传输协议 综述: HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则.计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从 ...
- hive 总结三(压缩)
本文参考:黑泽君相关博客 本文是我总结日常工作中遇到的坑,结合黑泽君相关博客,选取.补充了部分内容. 开启 map 输出阶段压缩可以减少 job 中 map 和 Reduce task 间数据传输量. ...
- day 54 Django基础四之模板系统
Django基础四之模板系统 本节目录 一 语法 二 变量 三 过滤器 四 标签Tags 五 模板继承 六 组件 七 自定义标签和过滤器 八 静态文件相关 一 语法 模板渲染的官方文档 关于模 ...
- PAT甲级——A1114 Family Property【25】
This time, you are supposed to help us collect the data for family-owned property. Given each person ...
- KVM桥接网络
1.什么是桥接网络 桥接网络:是指直接连接物理网络 桥接与NAT的区别:NAT是通过共享主机ip的方式进行上网,在你本地局域网内,别人是无法看到的:而桥接网络,是虚拟机通过dhcp的方式获取一个ip地 ...
- 2019 Multi-University Training Contest 6 Snowy Smile (最大字段和变形)
题意: 求一个子矩阵要求其矩阵内的合最大. 题解: 正常的求最大子矩阵的复杂度是O(n^3) 对于这一题说复杂度过不去,注意到这个题总共只有2000个点关键点在与这里优化 最大子矩阵可以压缩矩阵变成最 ...
- readv 和 writev
Unix 系统已经长时间支持名为 readv 和 writev 的 2 个系统调用. 这些 read 和 write 的"矢量"版本使用一个结构数组, 每个包含一个缓存的指针和一个 ...