[CSP-S模拟测试]:线性代数(模拟)
题目传送门(内部题113)
输入格式
第一行一个正整数$n$。
接下来$n$行,每行$n$个整数,描述$C$矩阵。保证输入的是一个林先森矩阵。
输出格式
若不可能实现,则输出一行$Impossible$;否则,输出一行一个仅包含$\{U,D,L,R\}$的字符串,表示一个$typ$参数的序列。你的序列长度不能超过$10^6$。若不需要进行任何操作,请将该序列留空。
样例
样例输入1:
2
1 2
3 0
样例输出1:
Impossible
样例输入2:
3
3 2 5
4 1 8
6 7 0
样例输出2:
UULDLU
数据范围与提示
本题采用子任务评分。仅当你通过一个子任务下所有测试点时,你才能获得该子任务的分数。
对于所有数据,$1\leqslant n\leqslant 50$。
$1.$($30$分)$n\leqslant 3$。
$2.$($30$分)$n\leqslant 10$。
$3.$($40$分)没有特殊限制。
题解
其实就是一个大模拟。
我们考虑从小到大填,也就是先填好右下角,每一行从右到左填,从下到上依次填好每一行,直到最后两行不管。
先说怎么填好每一行。
首先,先填好每一行$3\sim n$的每一个数,方法很简单,不再赘述。
$1,2$位置需要一起填,具体方法我们可以先想办法将其变成如下图所示的情况$\downarrow$
上图中,黑色为已经填好的块和边界,橙色为准备填的两个块,这样我们只需要将$0$向左再向上移动即可移动成下图的状态$\downarrow$
剩余$1,2$两行没有填好时只需要按上面填每行的$1,2$的方法填补即可。
最后剩下左上角一个$2\times 2$的方格时判断即可。
时间复杂度:$\Theta(n^3)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
using namespace std;
int n;
int Map[55][55],sec[55][55];
bool vis[55][55];
pair<int,int> pos[10000];
int top;
char ans[10000010];
int dis(int x,int y,int x2,int y2){return abs(x-x2)+abs(y-y2);}
void U()
{
swap(Map[pos[0].first][pos[0].second],Map[pos[0].first-1][pos[0].second]);
swap(pos[0],pos[Map[pos[0].first][pos[0].second]]);ans[++top]='U';
if(top>1e6){puts("Impossible");exit(0);}
}
void D()
{
swap(Map[pos[0].first][pos[0].second],Map[pos[0].first+1][pos[0].second]);
swap(pos[0],pos[Map[pos[0].first][pos[0].second]]);ans[++top]='D';
if(top>1e6){puts("Impossible");exit(0);}
}
void L()
{
swap(Map[pos[0].first][pos[0].second],Map[pos[0].first][pos[0].second-1]);
swap(pos[0],pos[Map[pos[0].first][pos[0].second]]);ans[++top]='L';
if(top>1e6){puts("Impossible");exit(0);}
}
void R()
{
swap(Map[pos[0].first][pos[0].second],Map[pos[0].first][pos[0].second+1]);
swap(pos[0],pos[Map[pos[0].first][pos[0].second]]);ans[++top]='R';
if(top>1e6){puts("Impossible");exit(0);}
}
int judge(int x,int y)
{
if(pos[0]==make_pair(x,y+1))return 1;
if(pos[0]==make_pair(x,y-1))return 2;
if(pos[0]==make_pair(x-1,y))return 3;
if(pos[0]==make_pair(x+1,y))return 4;
return 0;
}
void change(int x,int y)
{
while(1)
{
if(judge(x,y))break;
int flag=0;
if(pos[0].first-1==x&&pos[0].second==y)goto nxt1;
if(pos[0].first>1&&dis(x,y,pos[0].first,pos[0].second)>dis(x,y,pos[0].first-1,pos[0].second)&&!vis[pos[0].first-1][pos[0].second]){U();flag=1;}
nxt1:;
if(pos[0].first+1==x&&pos[0].second==y)goto nxt2;
if(pos[0].first<n&&dis(x,y,pos[0].first,pos[0].second)>dis(x,y,pos[0].first+1,pos[0].second)&&!vis[pos[0].first+1][pos[0].second]){D();flag=1;}
nxt2:;
if(pos[0].first==x&&pos[0].second-1==y)goto nxt3;
if(pos[0].second>1&&dis(x,y,pos[0].first,pos[0].second)>dis(x,y,pos[0].first,pos[0].second-1)&&!vis[pos[0].first][pos[0].second-1]){L();flag=1;}
nxt3:;
if(pos[0].first==x&&pos[0].second+1==y)goto nxt4;
if(pos[0].second<n&&dis(x,y,pos[0].first,pos[0].second)>dis(x,y,pos[0].first,pos[0].second+1)&&!vis[pos[0].first][pos[0].second+1]){R();flag=1;}
nxt4:;
if(!flag)break;
}
}
void move(int k,int x,int y)
{
int opt=judge(x,y);
switch(k)
{
case 1:
if(opt==1){U();L();D();}
if(opt==2){U();R();D();}
if(opt==3)D();
if(opt==4)
{
if(y>1){L();U();U();R();D();}
else{R();U();U();L();D();}
}
break;
case 2:
if(opt==1)
{
if(vis[x+1][y+1]){U();L();D();D();R();U();L();U();R();D();D();L();U();}
else{D();L();U();}
}
if(opt==2){D();R();U();}
if(opt==3)
{
if(y<n){R();D();}
else{L();D();D();R();U();}
}
if(opt==4)U();
break;
case 3:
if(opt==1){U();L();L();D();R();}
if(opt==2)R();
if(opt==3){L();D();R();}
if(opt==4){L();U();R();}
break;
case 4:
if(opt==1)L();
if(opt==2)
{
if(x>1){U();R();R();D();L();}
else
{
if(vis[x+1][y+1]){R();D();R();U();L();D();R();U();L();L();D();R();R();U();L();}
else{D();R();R();U();L();}
}
}
if(opt==3){R();D();L();}
if(opt==4)
{
if(vis[x+1][y+1]){L();U();}
else{R();U();L();}
}
break;
}
}
void move(int x,int y)
{
int res=sec[x][y];
while(pos[res]!=make_pair(x,y))
{
bool flag=0;
if(pos[res].first>1&&dis(x,y,pos[res].first,pos[res].second)>dis(x,y,pos[res].first-1,pos[res].second)&&!vis[pos[res].first-1][pos[res].second])
{change(pos[res].first,pos[res].second);move(1,pos[res].first,pos[res].second);flag=1;}
if(pos[res].first<n&&dis(x,y,pos[res].first,pos[res].second)>dis(x,y,pos[res].first+1,pos[res].second)&&!vis[pos[res].first+1][pos[res].second])
{change(pos[res].first,pos[res].second);move(2,pos[res].first,pos[res].second);flag=1;}
if(pos[res].second>1&&dis(x,y,pos[res].first,pos[res].second)>dis(x,y,pos[res].first,pos[res].second-1)&&!vis[pos[res].first][pos[res].second-1])
{change(pos[res].first,pos[res].second);move(3,pos[res].first,pos[res].second);flag=1;}
if(pos[res].second<n&&dis(x,y,pos[res].first,pos[res].second)>dis(x,y,pos[res].first,pos[res].second+1)&&!vis[pos[res].first][pos[res].second+1])
{change(pos[res].first,pos[res].second);move(4,pos[res].first,pos[res].second);flag=1;}
if(!flag)break;
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&Map[i][j]);sec[i][j]=(i-1)*n+j-1;
pos[Map[i][j]]=make_pair(i,j);
}
for(int i=n;i>2;i--)
for(int j=n;j;j--)
{
move(i,j);
vis[i][j]=1;
}
for(int j=n;j>1;j--)
{
move(2,j);vis[2][j]=1;
move(1,j);vis[1][j]=1;
}
if(pos[0]!=make_pair(1,1)){swap(Map[1][1],Map[2][1]);ans[++top]='U';}
printf("%s",ans+1);
return 0;
}
rp++
[CSP-S模拟测试]:线性代数(模拟)的更多相关文章
- 模拟测试—moq:简单一两句
在Xunit的基础上,说话模拟测试. 假如我们有这样一个控制器里面有这样一个方法,如图 我们在对Bar测试得时候,如果测试未通过,错误有可能来至于Bar,也有可能错误来至于serverde Foo方法 ...
- csp-s模拟测试98
csp-s模拟测试98 $T1$??不是我吹我轻松手玩20*20.$T2$装鸭好像挺可做?$T3$性质数据挺多提示很明显? $One$ $Hour$ $Later$ 这$T1$什么傻逼题真$jb$难调 ...
- 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 ...
- 利用Python中的mock库对Python代码进行模拟测试
这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下 ...
- 转 C#实现PID控制的模拟测试和曲线绘图
C#实现PID控制的模拟测试和曲线绘图 本文分两部分,一部分是讲PID算法的实现,另一部分是讲如何用动态的曲线绘制出PID运算的结果. 首先,PID算法的理论模型请参考自动控制理论,最早出现的是模 ...
- Mockito:一个强大的用于Java开发的模拟测试框架
https://blog.csdn.net/zhoudaxia/article/details/33056093 介绍 本文将介绍模拟测试框架Mockito的一些基础概念, 介绍该框架的优点,讲解应用 ...
- NOIP模拟测试1(2017081501)
好,今天是cgg第一次举行模拟测试,希望各位支持. 时间限制:2小时 题目链接: 题目一:水得都没名字了 题目二:车站 题目三:选数 不要觉得2小时太少,我的题目很良心,都很简单. 答案可以在模拟测试 ...
随机推荐
- docopt 安装及基本应用
什么是 docopt docopt是一种python 编写的命令行执行脚本的交互语言. 它是一种语言! 它是一种语言! 它是一种语言! 使用这种语言可以在自己的脚本中,添加一些规则限制,这样脚本在执行 ...
- Codeforces 1216F. Wi-Fi
传送门 这个题一眼 $dp$ 就是设 $f[i][0/1]$ 表示我们只考虑前 $i$ 个位置,并且保证覆盖了前 $i$ 个位置,当前位置 选/不选 的最小代价 考虑转移,设题目给出的字符串为 $s$ ...
- java中this总结(转载请注明出处)
1:this在构造方法中:this可以进行构造方法中的相互调用,this(参数): 2:this调用方法中,代表调用该方法的对象的地址,例如下面的代码比较 package thisTest; publ ...
- 机器学习-SVM-核函数
SVM-核函数 在研究了一天的SVM核函数后,我顿悟了一个道理: 研究和使用核函数的人,从一开始的目的就是把data分开而已.高维和映射,都是原来解释操作合理性的,但根本不是进行这一操作的原因 我为什 ...
- 使用docker构建supervisor全步骤
1.使用docker build 命令基于Dockerfile文件进行构建supervisor镜像,命令:docker build -t supervisor镜像名 Dockerfile文件放置的位置 ...
- JS定时器的用法及示例
JS定时器的用法及示例 目录 js 定时器的四个方法 示例一 示例二 示例三 js 定时器的四个方法 setInterval() :按照指定的周期(以毫秒计)来调用函数或计算表达式.方法会不停地调用函 ...
- 关于IDEA,多服务运行 Services -> Run Dashboard 部分服务添加变灰色,限制使用5个启动类,重启之后需要重新添加,服务在 Run Dashboard 中的显示排序问题,不显示 Services(Run Dashboard)
我的IDEA版本为最新版本 变灰色的原因就是因为右键删除了那个启动的主配置类,然后就会显示灰色,再次打开这个醒目,就不会在Run Dashboard中显示这个主配置类了 解决方法 如果你要 调整这些服 ...
- Java内存泄漏真实案例
内存泄漏:当不再需要一个对象时,垃圾收集器会回收它:如果不需要的对象一直在产生而不被收回,就称作“内存泄漏”. 以下为本人在工作中遇到的内存泄漏的案例: 1.对于大量的请求,使用了Executors. ...
- 会了docker你又多了一个谈资(上)
相信有到现在为止还是有很多同学只是听说过docker,但还不了解docker.也很想学习,但是又不知道从何入手,工作中又接触不到,而自己又懒得去翻阅各种学习资料,那么,读完本文,我保证,docker的 ...
- 7款js文件上传插件
1. jQuery File Upload 具有多文件上传.拖拽.进度条和图像预览功能的文件上传插件,支持跨域.分块.暂停恢复和客户端图像缩放.可与任何服务端平台(如PHP.Python.Ruby ...