题目背景

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. javaScript for in循环遍历对象

    for循环常被我们用来遍历数组,而如何遍历对象呢? 这时就需要用到for in循环了 写一个遍历对象名简写如下: for(var xxx in ooo){console.log(xxx)} 其中xxx ...

  2. ES6学习笔记(四)数值的扩展

    1.二进制和八进制表示法 ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示. 0b111110111 === 503 // true 0o767 === 503 ...

  3. <QT之Bug制造机>QT中串口类“QSerialPort”的学习笔记

    QT5中已经增加了串口类QSrialPort,可以直接调用API函数进行快速开发. 1. 获取串口信息 Dialog::Dialog(QWidget *parent) : QDialog(parent ...

  4. scrapy框架中间件配置代理

    scrapy框架中间件配置代理import random#代理池PROXY_http = [ '106.240.254.138:80', '211.24.102.168:80',]PROXY_http ...

  5. Android 第三方分享中遇到的问题以及解决方案

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 第三方登录和分享过程中难免遇到各种纠结的问题,下面将我遇到的分享给大家. 先说第三方登录 1.首先要 ...

  6. SQL Server 函数的使用 Function

    create table student ( id varchar2(5) primary key, name varchar2(20) not null, sex char(2) check(sex ...

  7. java基本的语法

     Java语言发展史 课程大纲: Java语言发展史: 1.sun公司1995年推出,2009年Oracle公司收购sun: 下载: 1.到Oracle官网下载 Java体系与特点 课程大纲: J ...

  8. 操作系统的 (program)loader(程序加载器)

    在计算机科学中,加载器(也叫程序加载器)属于操作系统的一部分,用于加载程序(programs)和库(libraries).加载器是执行程序和代码必不可少的组件,正是它负责将程序送入内存,为程序的运行提 ...

  9. 59.node的serve-favicon中间件的使用

    转自:https://www.zhi-jie.net/node-serve-favicon-use/ 有一个名称为serve-favicon的中间件,可以用于请求网页的favicon图标.譬如如下的使 ...

  10. Web跨域问题基础

    同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响.可以说Web是构建在同源策略基础之上的,浏览器只 ...