洛谷 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& ...
随机推荐
- BZOJ2690: 字符串游戏(平衡树动态维护Dfs序)
Description 给定N个仅有a~z组成的字符串ai,每个字符串都有一个权值vi,有M次操作,操作分三种: Cv x v':把第x个字符串的权值修改为v' Cs x a':把第x个字符串修改成a ...
- wordcontent小结
gitee地址: https://gitee.com/yzpdegit/test 问题描述: 计算一个文件中所包含的单词数,字符个数,行数 需求分析: WordCount的需求可以概括为:对程序设计语 ...
- Mark Sweep GC
目录 标记清除算法 标记阶段 深度优先于广度优先 清除阶段 分配 First-fit.Best-fit.Worst-fit三种分配策略 合并 优点 实现简单 与保守式GC算法兼容 缺点 碎片化 分配速 ...
- lunix 安装使用mongo
一.下载安装mongo版本客户端 1.进入mongo官网选择需要的版本号: https://www.mongodb.com/download-center/community(官网网址) 2.选择下载 ...
- Windows系统的关机、休眠和睡眠状态究的区别
原文:Windows系统的关机.休眠和睡眠状态究的区别 相信有些小伙伴跟我一样,对电脑的一些常用操作或名词不太熟悉,今天我们就简单来聊聊电脑的关机.休眠和睡眠状态究竟有何区别吧! 如果你在电脑左下角的 ...
- CentOS 7上安装gitlab-runner
1.yum install gitlab-runner -y 2.Registering Runners a.Run the following command: gitlab-runner regi ...
- codeforce 571 B Minimization
题意:给出一个序列,经过合适的排序后.使得最小. 做法:将a升序排序后,dp[i][j]:选择i个数量为n/k的集合,选择j个数量为n/k+1的集合的最小值. 举个样例, a={1,2,3,4,5,6 ...
- 用Nagios监控Sql Server服务器
在Suse 下配置Nagios来监控Ms SQL Server操作演示 本文出自 "李晨光原创技术博客" 博客,谢绝转载!
- 设置https验证方式
if (url.StartsWith("https", StringComparison.OrdinalIgnoreCase))
- 搭建 Nginx 静态网站
示例代码:/etc/nginx/nginx.conf user nginx;worker_processes auto;error_log /var/log/nginx/error.log;pid / ...