洛谷 P2790 ccj与zrz之积木问题
题目背景
ccj和zrz无聊到了玩起了搭积木...(本题选自uva101,翻译来自《算法竞赛入门经典2》)
题目描述
从左到右有n个木块,编号从0到n-1,要求模拟以下4种操作(下面的a和B都是木块编号,归为表示比如1号木块归到1号位去)。
move a onto b 把a和b上方的木块全部归位,然后把a摞在b上面。
move a over b 把a上方的全部归位,然后把a放在b所在木块堆的顶部。
pile a onto b 把b上方的木块全部归位,然后把a及上面的木块整体摞在b上面
pile a over b 把a及上面的木块整体摞在b所在木块堆的顶部。
遇到quit停止。a和b在同一堆的指令时非法指令,应当忽略。
最后输出每个位置的木块列表,按照从底部到顶部的顺序排列。
输入输出格式
输入格式:
第一行:n。
接下来若干行:每行一个指令(语法不会错),遇到quit停止。
输出格式:
n行,第i行输出一个i和冒号,然后一个空格,输出,它位置上的所有积木。
输入输出样例
10
move 9 onto 1
move 8 over 1
move 7 over 1
move 6 over 1
pile 8 over 6
pile 8 over 5
move 2 over 1
move 4 over 9
quit
0: 0
1: 1 9 2 4
2:
3: 3
4:
5: 5 8 7 6
6:
7:
8:
9:
说明
0 < n < 25。
思路:模拟
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,a,b;
int id[];
char s[][];
struct nond{
int num[],top;
}v[];
void work1(){
int pos=id[a];
for(int i=v[pos].top;i>=;i--)
if(v[pos].num[v[pos].top]!=a){
v[v[pos].num[v[pos].top]].top++;
id[v[id[a]].num[v[id[a]].top]]=v[id[a]].num[v[id[a]].top];
v[v[pos].num[v[pos].top]].num[v[v[pos].num[v[pos].top]].top]=v[pos].num[v[pos].top];
v[id[a]].top--;
}
else{
v[id[a]].top--;v[id[b]].top++;
v[id[b]].num[v[id[b]].top]=a;
id[a]=id[b];
break;
}
}
void work2(){
for(int i=v[id[a]].top;i>=;i--)
if(v[id[a]].num[v[id[a]].top]!=a){
v[v[id[a]].num[v[id[a]].top]].top++;
id[v[id[a]].num[v[id[a]].top]]=v[id[a]].num[v[id[a]].top];
v[v[id[a]].num[v[id[a]].top]].num[v[v[id[a]].num[v[id[a]].top]].top]=v[id[a]].num[v[id[a]].top];
v[id[a]].top--;
}
for(int i=v[id[b]].top;i>=;i--)
if(v[id[b]].num[v[id[b]].top]!=b){
v[v[id[b]].num[v[id[b]].top]].top++;
id[v[id[b]].num[v[id[b]].top]]=v[id[b]].num[v[id[b]].top];
v[v[id[b]].num[v[id[b]].top]].num[v[v[id[b]].num[v[id[b]].top]].top]=v[id[b]].num[v[id[b]].top];
v[id[b]].top--;
}
v[id[a]].top--;v[id[b]].top++;
v[id[b]].num[v[id[b]].top]=a;
id[a]=id[b];
}
void work3(){
for(int i=v[id[b]].top;i>=;i--)
if(v[id[b]].num[v[id[b]].top]!=b){
v[v[id[b]].num[v[id[b]].top]].top++;
id[v[id[b]].num[v[id[b]].top]]=v[id[b]].num[v[id[b]].top];
v[v[id[b]].num[v[id[b]].top]].num[v[v[id[b]].num[v[id[b]].top]].top]=v[id[b]].num[v[id[b]].top];
v[id[b]].top--;
}
int pos=id[a];
for(int i=v[pos].top;i>=;i--)
if(v[pos].num[i]==a){
for(int j=i;j<=v[pos].top;j++){
v[id[b]].top++;
v[id[b]].num[v[id[b]].top]=v[pos].num[j];
id[v[pos].num[j]]=id[b];
}
v[pos].top-=i;
break;
}
}
void work4(){
int pos=id[a];
for(int i=v[pos].top;i>=;i--)
if(v[pos].num[i]==a){
for(int j=i;j<=v[pos].top;j++){
v[id[b]].top++;
v[id[b]].num[v[id[b]].top]=v[pos].num[j];
id[v[pos].num[j]]=id[b];
}
v[pos].top-=i;
break;
}
}
int main(){
scanf("%d",&n);
for(int i=;i<n;i++) v[i].num[]=i,v[i].top=,id[i]=i;
for(int i=;i<=n;i++){
cin>>s[];
if(s[][]=='m'){
scanf("%d",&a);
scanf("%s %d",s[],&b);
if(id[a]==id[b]) continue;
if(s[][]=='v') work1();
else work2();
}
else if(s[][]=='p'){
scanf("%d",&a);
scanf("%s %d",s[],&b);
if(id[a]==id[b]) continue;
if(s[][]=='n') work3();
else work4();
}
else break;
}
for(int i=;i<n;i++){
cout<<i<<": ";
for(int j=;j<=v[i].top;j++)
cout<<v[i].num[j]<<" ";
cout<<endl;
}
}
调不出来的40分gg
思路:用vector维护。
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,a,b;
int h1,q1,h2,q2;
char p[],q[];
vector<int>s[];
void find(){
for(int i=;i<n;i++)
for(int o=;o<s[i].size();o++){
if(s[i][o]==a){ h1=i;q1=o; }
if(s[i][o]==b){ h2=i;q2=o; }
}
}
void moveonto(){
for(int i=q1+;i<s[h1].size();i++)
s[s[h1][i]].push_back(s[h1][i]);
for(int i=q2+;i<s[h2].size();i++)
s[s[h2][i]].push_back(s[h2][i]);
s[h1].resize(q1);
s[h2].resize(q2+);
s[h2].push_back(a);
}
void moveover(){
for(int i=q1+;i<s[h1].size();i++)
s[s[h1][i]].push_back(s[h1][i]);
s[h1].resize(q1);
s[h2].push_back(a);
}
void pileonto(){
for(int i=q2+;i<s[h2].size();i++)
s[s[h2][i]].push_back(s[h2][i]);
s[h2].resize(q2+);
for(int i=q1;i<s[h1].size();i++)
s[h2].push_back(s[h1][i]);
s[h1].resize(q1);
}
void pileover(){
for(int i=q1;i<s[h1].size();i++)
s[h2].push_back(s[h1][i]);
s[h1].resize(q1);
}
int main(){
scanf("%d",&n);
for(int i=;i<n;i++) s[i].push_back(i);
while(){
scanf("%s",p);
if(strcmp(p,"quit")==) break;
scanf("%d%s%d",&a,q,&b);
find();
if(h1==h2) continue;
if(strcmp(p,"move")==&&strcmp(q,"onto")==) moveonto();
if(strcmp(p,"move")==&&strcmp(q,"over")==) moveover();
if(strcmp(p,"pile")==&&strcmp(q,"onto")==) pileonto();
if(strcmp(p,"pile")==&&strcmp(q,"over")==) pileover();
}
for(int i=;i<n;i++){
printf("%d:",i);
for(int o=;o<s[i].size();o++)
printf(" %d",s[i][o]);
printf("\n");
}
}
洛谷 P2790 ccj与zrz之积木问题的更多相关文章
- 洛谷P2790 ccj与zrz之积木问题 题解
题目链接:https://www.luogu.org/problemnew/show/P2790 这题码量稍有点大... 分析: 这道题模拟即可.因为考虑到所有的操作vector可最快捷的实现,所以数 ...
- 洛谷P1969 [NOIP2013提高组Day2T1] 积木大赛
P1969 积木大赛 题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前, ...
- 洛谷P2342-叠积木
Problem 洛谷P2342-叠积木 Accept: 373 Submit: 1.1k Time Limit: 1000 mSec Memory Limit : 128MB Problem ...
- 洛谷P5274 优化题(ccj)
洛谷P5274 优化题(ccj) 题目背景 CCJCCJ 在前往参加 Universe \ OIUniverse OI 的途中... 题目描述 有一个神犇 CCJCCJ,他在前往参加 Universe ...
- 洛谷OJ P1196 银河英雄传说(带权并查集)
题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...
- 洛谷 P5019 铺设道路
题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...
- 洛谷 P1510 精卫填海
洛谷 P1510 精卫填海 题目描述 [版权说明] 本题为改编题. [问题描述] 发鸠之山,其上多柘木.有鸟焉,其状如乌,文首,白喙,赤足,名曰精卫,其名自詨.是炎帝之少女,名曰女娃.女娃游于东海,溺 ...
- 【洛谷】P4594 [COCI2011-2012#5] BLOKOVI
本来已经有一个专门记录洛谷题目的博客了,但这个题之毒瘤...... 为你专门写一篇总行了吧...... 传送门 先说一句,这个题每次摆放都靠到最右边不一定是最优的 因为它可以这个亚子 就是说上面那个块 ...
- 【noip】跟着洛谷刷noip题2
noip好难呀. 上一个感觉有点长了,重开一个. 36.Vigenère 密码 粘个Openjudge上的代码 #include<cstdio> #include<iostream& ...
随机推荐
- canvas和svg小记
一.关于canvas <canvas> 是 HTML5 新增的元素,可用于通过使用JavaScript中的脚本来绘制图形 例如,它可以用于绘制图形,创建动画. <canvas> ...
- ChinaVis2015 第一天会议
第二届 ChinaVis 2015 在天津举行,非常幸运发现者个会议,并在导师的带领下參与本次会议. 主要要是以可视化与可视分析为背景进行讲座,以马匡六为Speaker.袁晓如,张加万等致辞开幕式. ...
- hdu5372 Segment Game
Problem Description Lillian is a clever girl so that she has lots of fans and often receives gifts f ...
- onvif开发总结
ONVIF开发经验总结 ONVIF开发经验总结............................................................................. ...
- 关于cook操作
http://www.cnblogs.com/fishtreeyu/archive/2011/10/06/2200280.html
- Kinect 开发 —— 手势识别(下)
基本手势追踪 手部追踪在技术上和手势识别不同,但是它和手势识别中用到的一些基本方法是一样的.在开发一个具体的手势控件之前,我们先建立一个可重用的追踪手部运动的类库以方便我们后续开发.这个手部追踪类库包 ...
- 【Educational Codeforces Round 36 B】Browser
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 分类在区间里面和左边.右边三种情况. 看看l的左边有没有标签.r的右边有没有标签. 就能做完了. [代码] #include < ...
- 【2017 Multi-University Training Contest - Team 4】Time To Get Up
[Link]: [Description] [Solution] 把每个数字长什么样存到数组里就好;傻逼题. (直接输入每一行是什么样子更快,不要一个字符一个字符地输入) [NumberOf WA] ...
- 继承AbstractRoutingDataSource再通过AOP实现动态数据源切换(转)
关于AbstractRoutingDataSource我在研究开源中国的开源项目时候才发现,好奇的看了一下代码发现自己看不明白,大概就看懂了Spring AOP切面这里,根据注释作者的意思是通过这个可 ...
- Ubuntu 美团sql优化工具SQLAdvisor的安装(转)
by2009 by2009 发表于 3 个月前 SQLAdvisor简介 SQLAdvisor是由美团点评公司技术工程部DBA团队(北京)开发维护的一个分析SQL给出索引优化建议的工具.它基于MySQ ...