题目背景

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和冒号,然后一个空格,输出,它位置上的所有积木。

输入输出样例

输入样例#1: 复制

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
输出样例#1: 复制

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之积木问题的更多相关文章

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

    题目链接:https://www.luogu.org/problemnew/show/P2790 这题码量稍有点大... 分析: 这道题模拟即可.因为考虑到所有的操作vector可最快捷的实现,所以数 ...

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

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

  3. 洛谷P2342-叠积木

    Problem 洛谷P2342-叠积木 Accept: 373   Submit: 1.1k Time Limit: 1000 mSec    Memory Limit : 128MB Problem ...

  4. 洛谷P5274 优化题(ccj)

    洛谷P5274 优化题(ccj) 题目背景 CCJCCJ 在前往参加 Universe \ OIUniverse OI 的途中... 题目描述 有一个神犇 CCJCCJ,他在前往参加 Universe ...

  5. 洛谷OJ P1196 银河英雄传说(带权并查集)

    题目描述 公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦 创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山 ...

  6. 洛谷 P5019 铺设道路

    题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...

  7. 洛谷 P1510 精卫填海

    洛谷 P1510 精卫填海 题目描述 [版权说明] 本题为改编题. [问题描述] 发鸠之山,其上多柘木.有鸟焉,其状如乌,文首,白喙,赤足,名曰精卫,其名自詨.是炎帝之少女,名曰女娃.女娃游于东海,溺 ...

  8. 【洛谷】P4594 [COCI2011-2012#5] BLOKOVI

    本来已经有一个专门记录洛谷题目的博客了,但这个题之毒瘤...... 为你专门写一篇总行了吧...... 传送门 先说一句,这个题每次摆放都靠到最右边不一定是最优的 因为它可以这个亚子 就是说上面那个块 ...

  9. 【noip】跟着洛谷刷noip题2

    noip好难呀. 上一个感觉有点长了,重开一个. 36.Vigenère 密码 粘个Openjudge上的代码 #include<cstdio> #include<iostream& ...

随机推荐

  1. canvas和svg小记

    一.关于canvas <canvas> 是 HTML5 新增的元素,可用于通过使用JavaScript中的脚本来绘制图形 例如,它可以用于绘制图形,创建动画. <canvas> ...

  2. ChinaVis2015 第一天会议

    第二届  ChinaVis 2015 在天津举行,非常幸运发现者个会议,并在导师的带领下參与本次会议. 主要要是以可视化与可视分析为背景进行讲座,以马匡六为Speaker.袁晓如,张加万等致辞开幕式. ...

  3. hdu5372 Segment Game

    Problem Description Lillian is a clever girl so that she has lots of fans and often receives gifts f ...

  4. onvif开发总结

    ONVIF开发经验总结 ONVIF开发经验总结............................................................................. ...

  5. 关于cook操作

    http://www.cnblogs.com/fishtreeyu/archive/2011/10/06/2200280.html

  6. Kinect 开发 —— 手势识别(下)

    基本手势追踪 手部追踪在技术上和手势识别不同,但是它和手势识别中用到的一些基本方法是一样的.在开发一个具体的手势控件之前,我们先建立一个可重用的追踪手部运动的类库以方便我们后续开发.这个手部追踪类库包 ...

  7. 【Educational Codeforces Round 36 B】Browser

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 分类在区间里面和左边.右边三种情况. 看看l的左边有没有标签.r的右边有没有标签. 就能做完了. [代码] #include < ...

  8. 【2017 Multi-University Training Contest - Team 4】Time To Get Up

    [Link]: [Description] [Solution] 把每个数字长什么样存到数组里就好;傻逼题. (直接输入每一行是什么样子更快,不要一个字符一个字符地输入) [NumberOf WA] ...

  9. 继承AbstractRoutingDataSource再通过AOP实现动态数据源切换(转)

    关于AbstractRoutingDataSource我在研究开源中国的开源项目时候才发现,好奇的看了一下代码发现自己看不明白,大概就看懂了Spring AOP切面这里,根据注释作者的意思是通过这个可 ...

  10. Ubuntu 美团sql优化工具SQLAdvisor的安装(转)

    by2009 by2009 发表于 3 个月前 SQLAdvisor简介 SQLAdvisor是由美团点评公司技术工程部DBA团队(北京)开发维护的一个分析SQL给出索引优化建议的工具.它基于MySQ ...