题目背景

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. ES6学习笔记(九)Set和Map数据结构

    1.set 基本等于Java的Set集合类型,无序不可重复集,常被用来去重. 基本用法 const s = new Set();//通过Set()构造函数创建 [2, 3, 5, 4, 5, 2, 2 ...

  2. 昼猫笔记 -- 面向对象(II) - 继承

    继承 由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念. 所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现,还有就是js可以 ...

  3. Linux学习总结(5)——CentOS常用的目录文件操作命令

    CentOS常用的目录文件操作命令 一.路径操作的CentOS常用命令  cd pwd  NO1. 显示当前路径  [root@rehat root]# pwd  NO2. 返回用户主目录  [roo ...

  4. jQuery源码02--(3043 , 3183) Deferred : 延迟对象 : 对异步的统一管理

    //延迟对象 jQuery.extend({ Deferred: function( func ) { var tuples = [//resolve完成.reject未完成.notify进行中类似于 ...

  5. js--11对象的创建方式

    <html> <head> <title>Object</title> </head> <body> <script ty ...

  6. Docs-->.NET-->API reference-->System.​Web.​UI-->Control-->Methods-->Find​Control

    https://docs.microsoft.com/en-us/dotnet/api/system.web.ui.control.findcontrol?view=netframework-4.7 ...

  7. HTTP -- 请求/响应 结构

    一:一个HTTP请求报文由四个部分组成:请求行.请求头部.空行.请求数据. 1.请求行 1.请求方法:GET POST 2.URL字段 3.HTTP版本字段 2.请求头 1.Accept:浏览器可接受 ...

  8. Css盒模型有哪几部分,标准盒模型和IE盒模型有哪些区别

    首先介绍Css的盒模型也就是标准盒模型(BOX Model) 包含了 内容(content) 内边距(padding) 边框(border) 外边框(margin) 这是大家经常用到的,也是现在的标准 ...

  9. 如何使iframe外部的超级链接的页面在iframe中打开

    如何使iframe外部的超级链接的页面在iframe中打开,有以下两种方法: 一.html方法: <iframe name="a1"></iframe> & ...

  10. POJ 3038 贪心(multiset)

    题意: 思路: 1. 贪心 我们考虑肯定是走最近的最合适 想象自己是一个黑一日游的司机: 1.如果有乘客要上车,那么就让他上,收钱! 2.如果超载了,把距目的地最远的几个乘客踢下去,退钱. 3.行驶到 ...