[CSP-S模拟测试]:骆驼(模拟+构造)
题目描述
我们都熟悉走马步,现在我们定义一种新的移动方式——骆驼步,它在一个国际棋盘上的移动规则是这样的。

以看出,骆驼步可以向八个方向走动,且不能走出棋盘范围。
现在给出一个$N\times N$的棋盘,其中$N$是$5$的倍数。你需要从左上角出发,每步按照骆驼步的规则,经过每个格子恰好一次,且当你走了$N^2-1$步后,你离起点恰好只有一步的距离。
请给出一种合法的方案。
输入格式
第一行有一个整数$N$,表示$N\times N$的棋盘
输出格式
如果无解,输出$"impossible"$
否则,你输出一个$N\times N$的矩阵,其中$a_{i,j}$表示$(i,j)$是你经过的第$a_{i,j}$个格子。
样例
样例输入:
10
样例输出:
1 52 29 8 51 28 9 50 37 16
85 95 59 86 94 66 87 93 65 88
40 19 100 39 18 76 38 17 77 49
2 53 30 7 58 27 10 89 36 15
84 96 60 75 99 67 72 92 64 71
41 20 82 44 23 90 45 24 78 48
3 54 31 6 57 26 11 68 35 14
83 97 61 74 98 62 73 91 63 70
42 21 81 43 22 80 46 25 79 47
4 55 32 5 56 33 12 69 34 13
数据范围与提示
对于所有数据,保证$N\leqslant 1,000$且$N$是$5$的倍数。
其中一个数据点$N=5$,占$20$分,剩余$16$个数据点,每个$5$分。
题解
$N$是$5$的倍数无形中提示着我们不可能有$"impossible"$的数据点。
其中一个数据点$N=5$又提示着我们从这里入手。
事实证明,在一个$5\times 5$的格子里,从一个格子出发能终点可以是任意一个格子,那么可以考虑先预处理出来一些$5\times 5$的走法,然后拼接起来。
那么这时候分为两种情况:
$\alpha.N$是奇数。
$\beta.N$是偶数。
对于情况$\alpha$有这样一个构造方案:

上图中白点为总的起点,灰点表示每一个$5\times 5$的格子的起点,蓝点表示终点,黄点和红点分别表示最后两步。
对于情况$\beta$有这样一个构造方案:

上图中白点为总的起点,灰点表示每一个$5\times 5$的格子的起点,蓝点表示终点,红点表示最后一步。
这样为题就简单多了,我们需要预处理七种$5\times 5$的格子,然后按照如上方案构造即可。
注意$N=5$需要特判
时间复杂度:$\Theta(n^2)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n;
int Map[1001][1001],t;
int base1[6][6]={0,0,0,0,0,0,0,1,6,11,-1,5,0,9,15,3,8,16,0,12,21,18,13,22,0,2,7,10,-1,4,0,19,14,23,20,17};
int base2[6][6]={0,0,0,0,0,0,0,10,21,6,9,22,0,16,13,24,19,14,0,5,8,1,4,7,0,11,20,15,12,23,0,17,3,25,18,2};
int base3[6][6]={0,0,0,0,0,0,0,18,10,24,17,9,0,13,21,7,12,22,0,5,16,1,4,25,0,19,11,23,20,8,0,14,3,6,15,2};
int base4[6][6]={0,0,0,0,0,0,0,21,10,25,22,9,0,15,18,7,12,17,0,5,23,1,4,24,0,20,11,16,19,8,0,14,3,6,13,2};
int base5[6][6]={0,0,0,0,0,0,0,18,5,24,19,6,0,10,21,16,9,22,0,25,13,1,4,14,0,17,8,23,20,7,0,11,3,15,12,2};
int base6[6][6]={0,0,0,0,0,0,0,25,17,7,24,16,0,12,4,21,13,5,0,19,9,1,18,8,0,22,14,6,23,15,0,11,3,20,10,2};
int base7[6][6]={0,0,0,0,0,0,0,1,6,13,21,5,0,11,19,3,8,18,0,14,22,-1,15,23,0,2,7,12,20,4,0,10,16,24,9,17};
void up(int x,int y)
{
x--;y--;
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
Map[x*5+i][y*5+j]=base4[i][j]+t;
t+=25;
}
void down(int x,int y)
{
x--;y--;
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
Map[x*5+i][y*5+j]=base2[i][j]+t;
t+=25;
}
void right(int x,int y)
{
x--;y--;
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
Map[x*5+i][y*5+j]=base3[i][j]+t;
t+=25;
}
void left(int x,int y)
{
x--;y--;
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
Map[x*5+i][y*5+j]=base5[i][j]+t;
t+=25;
}
void work1()
{
t=23;
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
Map[i][j]=base1[i][j];
Map[4][4]=n*n-1;
Map[1][4]=n*n;
for(int i=2;i<n/5;i++)down(i,1);
right(n/5,1);
for(int i=n/5;i>2;i--)
{
if(i&1)
{
for(int j=2;j<n/5;j++)right(i,j);
up(i,n/5);
}
else
{
for(int j=n/5;j>2;j--)left(i,j);
up(i,2);
}
}
for(int i=n/5;i>2;i--)
{
if(i&1)
{
up(2,i);
left(1,i);
}
else
{
down(1,i);
left(2,i);
}
}
down(1,2);
for(int i=6;i<=10;i++)
for(int j=6;j<=10;j++)
Map[i][j]=base6[i-5][j-5]+t;
}
void work2()
{
for(int i=1;i<=5;i++)
for(int j=1;j<=5;j++)
Map[i][j]=base7[i][j];
Map[3][3]=n*n;t=24;
for(int i=2;i<n/5;i++)down(i,1);
right(n/5,1);
for(int i=n/5;i>=2;i--)
{
for(int j=2;j<n/5;j++)right(i,j);
up(i,n/5);
i--;
for(int j=n/5;j>=3;j--)left(i,j);
up(i,2);
}
t-=25;left(1,2);
}
int main()
{
scanf("%d",&n);
if(n==5){puts("1 9 19 2 10\n14 22 5 13 21\n7 17 25 8 18\n4 12 20 3 11\n15 23 6 16 24");return 0;}
if(n&1)work1();
else work2();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%d ",Map[i][j]);
puts("");
}
return 0;
}
rp++
[CSP-S模拟测试]:骆驼(模拟+构造)的更多相关文章
- [CSP-S模拟测试]:序列(构造)
题目描述 给定$N,A,B$,构造一个长度为$N$的排列,使得:$\bullet$排列长度为$N$:$\bullet$最长上升子序列长度为$A$:$\bullet$最长下降子序列长度为$B$.我们有$ ...
- 模拟测试—moq:简单一两句
在Xunit的基础上,说话模拟测试. 假如我们有这样一个控制器里面有这样一个方法,如图 我们在对Bar测试得时候,如果测试未通过,错误有可能来至于Bar,也有可能错误来至于serverde Foo方法 ...
- Mockito:一个强大的用于Java开发的模拟测试框架
https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...
- Mock 模拟测试简介及 Mockito 使用入门
Mock 是什么mock 测试就是在测试过程中,对于某些不容易构造或者不容易获取的对象,用一个虚拟的对象来创建以便测试的测试方法.这个虚拟的对象就是mock对象.mock对象就是真实对象在调试期间的代 ...
- springboot2.0入门(四)----mock模拟测试+单元测试
一.本节主要记录模拟测试.单元测试: 二.mock 测试 1.1什么是Mock? 在面向对象程序设计中,模拟对象(英语:mock object,也译作模仿对象)是以可控的方式模拟真实对象行为的假的对象 ...
- csp-s模拟测试97
csp-s模拟测试97 猿型毕露.水题一眼秒,火题切不动,还是太菜了. $T1$看了一会儿感觉$woc$期望题$T1??$假的吧??. $T2$秒. $T3$什么玩意儿. 40 01:24:46 00 ...
- Android单元测试与模拟测试详解
测试与基本规范 为什么需要测试? 为了稳定性,能够明确的了解是否正确的完成开发. 更加易于维护,能够在修改代码后保证功能不被破坏. 集成一些工具,规范开发规范,使得代码更加稳定( 如通过 phabri ...
- [开源]微信在线信息模拟测试工具(基于Senparc.Weixin.MP开发)
目前为止似乎还没有看到过Web版的普通消息测试工具(除了官方针对高级接口的),现有的一些桌面版的几个测试工具也都是使用XML直接请求,非常不友好,我们来尝试做一个“面向对象”操作的测试工具. 测试工具 ...
- 安装nginx python uwsgi环境 以及模拟测试
uwsgi帮助文档: http://uwsgi-docs-cn.readthedocs.io/zh_CN/latest/WSGIquickstart.html http://uwsgi-docs.re ...
随机推荐
- switch条件变量的取值类型
switch条件变量的取值类型主要有以下六种: 1)JDK1.5(不含JDK1.5)之前只能是byte.short.int.char类型,不能是float.double.long.boolean类型. ...
- vue使用笔记一
1.vue-cli安装 sudo npm install -g @vue/cli 2.查看是否安装成功 vue --version 3.创建项目 vue create hello-world 4.启动 ...
- 《剑指offer》面试题23 从上往下打印二叉树 Java版
注意层序遍历的时候对每一层的处理方式可能不同,这里把每一层的元素保存进一个List中了,那么就需要记录每一层的数量. public List<List<Integer>> se ...
- Luogu P5339 [TJOI2019]唱、跳、rap和篮球
题目 设\(f_i\)表示从\((a-4i,b-4i,c-4i,d-4i)\)中选\(n-4i\)个排队的方案数. 那么我们可以容斥,答案为\(\sum\limits_{i=0}^{lim}(-1)^ ...
- php 操作Redis发送短信
循环查询redis队列里面的数据 然后提交数据后将反馈信息再写入另一个 redis list里面 代码 <?php /** * System Name: sent message * User: ...
- 一、JVM — Java内存区域
Java 内存区域详解 写在前面 (常见面试题) 基本问题 拓展问题 一 概述 二 运行时数据区域 2.1 程序计数器 2.2 Java 虚拟机栈 2.3 本地方法栈 2.4 堆 2.5 方法区 2. ...
- 4G 内存怎么读取一个 5G 的数据?
方法一:可以通过生成器,分多次读取,每次读取数量相对少的数据(比如 500MB)进行处理,处理结束后在读取后面的 500MB 的数据. 方法二:可以通过 linux 命令 split 切割成小文件,然 ...
- QRCode.js一个生成二维码的javascript库
前言 最近在开发中遇到一个需求:将后端返回的链接转换成二维码,那么如何来实现呢?我们可以使用QRCode.js来解决这一问题 什么是 QRCode.js? QRCode.js 是一个用于生成二维码的 ...
- 简单的物流项目实战,WPF的MVVM设计模式(一)
新建一个WPF项目,命名为WMS 然后分别新建文件夹,Data,Models,Views,ViewModels,Services,如下图所示 然后通过NuGet安装连个Nuget包,分别为SQLite ...
- 值不能为null.参数名: viewInfo,如何解决
有蓝队网络服务器租用客户反映在一台服务器上使用数据库管理工具时弹出了如下错误 :值不能为null.参数名: viewInfo (Microsoft.SqlServer.Management.SqlSt ...