题目链接:https://www.luogu.org/problemnew/show/P2790

这题码量稍有点大。。。

分析:

这道题模拟即可。因为考虑到所有的操作vector可最快捷的实现,所以数组动态vector。每一种情况分别考虑。

其他的见代码注释

部分过长的注释防在这里,请对照序号到代码中查看。

:wa意为a的位置,记录当前a所在位置的序号。

wb意为b的位置,记录当前b所在位置的序号。

ca意为a的层数,记录当前a所在这堆积木中第几个。

cb意为b的层数,记录当前b所在这堆积木中第几个。

其他定义显而易见。

:search遍历一遍所有位置所有积木,找到a或b后记录他们的位置和位置中第几个,相当于为后面的一个初始化吧。

:此函数即move onto,按照题意模拟即可,之后④⑤⑥均如此,具体模拟步骤会详细说明。

代码:

#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
int wa,wb,ca,cb;//①
char s1[10],s2[10];
int a,b;
vector<int>v[30];
int n;
void search()//②
{
for(int i=0;i<n;i++)
{
for(int j=0;j<v[i].size();j++)
{
if(v[i][j]==a)
{
wa=i;
ca=j;
}
if(v[i][j]==b)
{
wb=i;
cb=j;
}
}
}
}
void moon()//③
{
for(int i=ca+1;i<v[wa].size();i++)
{
v[v[wa][i]].push_back(v[wa][i]);
}//把a以上的归位
for(int i=cb+1;i<v[wb].size();i++)
{
v[v[wb][i]].push_back(v[wb][i]);
}//把b以上的归位
v[wa].resize(ca);//只保留当前vector到a-1
v[wb].resize(cb+1);//但是b要保留,因为a是要摞到b上的
v[wb].push_back(a);//摞上去
}//下面的都换汤不换药,我想大家都应该知道
void moov()//④
{
for(int i=ca+1;i<v[wa].size();i++)
{
v[v[wa][i]].push_back(v[wa][i]);
}
v[wa].resize(ca);
v[wb].push_back(a);
}
void pion()//⑤
{
for(int i=cb+1;i<v[wb].size();i++)
{
v[v[wb][i]].push_back(v[wb][i]);
}
v[wb].resize(cb+1);
for(int i=ca;i<v[wa].size();i++)
{
v[wb].push_back(v[wa][i]);
}
v[wa].resize(ca);
}
void piov()//⑥
{
for(int i=ca;i<v[wa].size();i++)
{
v[wb].push_back(v[wa][i]);
}
v[wa].resize(ca);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
{
v[i].push_back(i);
}
while(1)
{
scanf("%s",s1);
if(strcmp(s1,"quit")==0)break;//提前判断是否退出
scanf("%d%s%d",&a,s2,&b);
search();
if(wa==wb)continue;//根据题意,如果a和b在同一堆,那么忽略
if(strcmp(s1,"move")==0&&strcmp(s2,"onto")==0)moon();
if(strcmp(s1,"move")==0&&strcmp(s2,"over")==0)moov();
if(strcmp(s1,"pile")==0&&strcmp(s2,"onto")==0)pion();
if(strcmp(s1,"pile")==0&&strcmp(s2,"over")==0)piov();
//逐一判断每种操作,其中相应的子函数对应去两个单词的首字母连起来
}
for(int i=0;i<n;i++)
{
printf("%d:",i);//暂时不输出括号,有了再打
for(int j=0;j<v[i].size();j++)
{
printf(" %d",v[i][j]);//当前位置有积木,那么就打出来,别忘了空格
}
printf("\n");//每次换行
}
return 0;
}

洛谷P2790 ccj与zrz之积木问题 题解的更多相关文章

  1. 洛谷 P2790 ccj与zrz之积木问题

    P2790 ccj与zrz之积木问题 题目背景 ccj和zrz无聊到了玩起了搭积木...(本题选自uva101,翻译来自<算法竞赛入门经典2>) 题目描述 从左到右有n个木块,编号从0到n ...

  2. 【洛谷P3369】【模板】普通平衡树题解

    [洛谷P3369][模板]普通平衡树题解 题目链接 题意: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3 ...

  3. 洛谷 P1992 不想兜圈的老爷爷 题解

    洛谷 P1992 不想兜圈的老爷爷 题解 题目描述 一位年过古稀的老爷爷在乡间行走 而他不想兜圈子 因为那会使他昏沉 偶然路过小A发扬助人为乐优良传统 带上地图 想知道路况是否一定使他清醒 usqwe ...

  4. BZOJ5285 & 洛谷4424 & UOJ384:[HNOI/AHOI2018]寻宝游戏——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5285 https://www.luogu.org/problemnew/show/P4424 ht ...

  5. 洛谷p3384【模板】树链剖分题解

    洛谷p3384 [模板]树链剖分错误记录 首先感谢\(lfd\)在课上调了出来\(Orz\) \(1\).以后少写全局变量 \(2\).线段树递归的时候最好把左右区间一起传 \(3\).写\(dfs\ ...

  6. 洛谷 P1789 【Mc生存】插火把 题解

    P1789 [Mc生存]插火把 题目背景 初一党应该都知道...... 题目描述 话说有一天 linyorson 在"我的世界"开了一个 \(n\times n(n\le 100) ...

  7. 洛谷P1969 [NOIP2013提高组Day2T1] 积木大赛

    P1969 积木大赛 题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前, ...

  8. 洛谷P1066 2^k进制数(题解)(递推版)

    https://www.luogu.org/problemnew/show/P1066(题目传送) (题解)https://www.luogu.org/problemnew/solution/P106 ...

  9. 洛谷P1373小a和uim大逃离题解

    题目 这个题好坑啊,首先是他会卡空间,然后我们就只能把一种比较好理解的状态给舍弃,因为空间开不下,然而采用一种难理解的状态就是\(dp[i][j][l][0/1]\)表示\(i\),\(j\)位置,两 ...

随机推荐

  1. C#高性能大容量SOCKET并发(十一):编写上传客户端

    原文:C#高性能大容量SOCKET并发(十一):编写上传客户端 客户端封装整体框架 客户端编程基于阻塞同步模式,只有数据正常发送或接收才返回,如果发生错误则抛出异常,基于TcpClient进行封装,主 ...

  2. 压缩大文件时如何限制CPU使用率?----几种CPU资源限制方法的测试说明

    一.说明 我们的MySQL实例在备份后需要将数据打包压缩,部分低配机器在压缩时容易出现CPU打满导致报警的情况,需要在压缩文件时进行CPU资源的限制. 因此针对此问题进行了相关测试,就有了此文章. 二 ...

  3. PowerDesigner逆向工程导入MYSQL数据库总结(不容易,感谢前者们)

    原文:PowerDesigner逆向工程导入MYSQL数据库总结(不容易,感谢前者们) 参考来源: http://blog.csdn.net/chamtianjiao/article/details/ ...

  4. [Game-0001] 新手引导逻辑梳理

    欢迎任何形式的转载,但请务必注明出处:http://www.cnblogs.com/liangjingyang 欢迎任何形式的转载,但请务必注明出处:http://www.cnblogs.com/li ...

  5. Elasticsearch 6.1.2 搭建及使用教程一

    安装包: es6.1.2 es-head 开发环境:jdk 1.8 搭建流程一一说明: 将下载好的es解压后找到如下图文件 打开后如下图所示配置(已添加详细注释): # 集群的名字 cluster.n ...

  6. vue路由传参query和params的区别(详解!)

    1.query使用path和name传参都可以,而params只能使用name传参. query传参: 页面: this.$router.push({ path:'/city',name:'City' ...

  7. 老雷socket编程之认识常用协议

    老雷socket编程之常见网络协议 1.ip IP协议是将多个包交换网络连接起来,它在源地址和目的地址之间传送一种称之为数据包的东西, 它还提供对数据大小的重新组装功能,以适应不同网络对包大小的要求. ...

  8. LBXF时间管理法2.0

    前言 LBXF是柳比歇夫的中文拼音缩写,下文中会着重介绍柳比歇夫 时间管理法主要帮助我们提高生产性时间,以及提高生产效率.我会按照柳比歇夫.执行步骤.时间管理工具Toggle三个模块来讲解LBXF时间 ...

  9. python - 博客目录

    博客目录 python基础部分 函数 初识函数 函数进阶 装饰器函数 迭代器和生成器 内置函数和匿名函数 递归函数 常用模块 常用模块 模块和包 面向对象 初识面向对象 面向对象进阶 网络编程 网络编 ...

  10. Golang之mirco框架部分浅析

    在实习中使用 micro 框架,但是挺多不懂的,看了部分源码搞懂了一些,还是有一些比较复杂没搞懂. 第一部分:初始化 service 并修改端口 main.go // waitgroup is a h ...