洛谷 P2790 ccj与zrz之积木问题
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。
思路:模拟
![](/assets/blank.gif)
![](/assets/blank.gif)
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,a,b; int id[30]; char s[3][5]; struct nond{int num[30],top; }v[30]; void work1(){int pos=id[a];for(int i=v[pos].top;i>=1;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>=1;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>=1;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>=1;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>=1;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>=1;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=0;i<n;i++) v[i].num[1]=i,v[i].top=1,id[i]=i;for(int i=1;i<=n;i++){cin>>s[1];if(s[1][0]=='m'){scanf("%d",&a);scanf("%s %d",s[2],&b);if(id[a]==id[b]) continue;if(s[2][1]=='v') work1();else work2();}else if(s[1][0]=='p'){scanf("%d",&a);scanf("%s %d",s[2],&b);if(id[a]==id[b]) continue;if(s[2][1]=='n') work3();else work4();}else break;}for(int i=0;i<n;i++){cout<<i<<": ";for(int j=1;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[10],q[10]; vector<int>s[32]; void find(){for(int i=0;i<n;i++)for(int o=0;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+1;i<s[h1].size();i++)s[s[h1][i]].push_back(s[h1][i]);for(int i=q2+1;i<s[h2].size();i++)s[s[h2][i]].push_back(s[h2][i]);s[h1].resize(q1);s[h2].resize(q2+1);s[h2].push_back(a); } void moveover(){for(int i=q1+1;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+1;i<s[h2].size();i++)s[s[h2][i]].push_back(s[h2][i]);s[h2].resize(q2+1);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=0;i<n;i++) s[i].push_back(i);while(1){scanf("%s",p);if(strcmp(p,"quit")==0) break;scanf("%d%s%d",&a,q,&b);find();if(h1==h2) continue;if(strcmp(p,"move")==0&&strcmp(q,"onto")==0) moveonto();if(strcmp(p,"move")==0&&strcmp(q,"over")==0) moveover();if(strcmp(p,"pile")==0&&strcmp(q,"onto")==0) pileonto();if(strcmp(p,"pile")==0&&strcmp(q,"over")==0) pileover();}for(int i=0;i<n;i++){printf("%d:",i);for(int o=0;o<s[i].size();o++)printf(" %d",s[i][o]);printf("\n");} }
转载于:https://www.cnblogs.com/cangT-Tlan/p/7881427.html
洛谷 P2790 ccj与zrz之积木问题相关推荐
- 洛谷P2790 ccj与zrz之积木问题 题解
题目链接:https://www.luogu.org/problemnew/show/P2790 这题码量稍有点大... 分析: 这道题模拟即可.因为考虑到所有的操作vector可最快捷的实现,所以数 ...
- 洛谷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 ...
- 01背包的应用~洛谷P1504 积木城堡
题目描述 XC 的儿子小 XC 最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木. 小 XC 是一个比他爸爸 XC 还聪明的孩子,他发现垒城堡的时候,如果下面的 ...
- 洛谷 P1504 积木城堡
洛谷 P1504 积木城堡 题目 题目描述 XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡 ...
- 洛谷 深基 第4部分 基础数学与数论(19-21课)
洛谷 深基 第4部分 基础数学与数论 第19章 位运算与进制转换 P1143 进制转换 https://www.luogu.com.cn/problem/P1143 洛谷P1143 进制转换的Pyt ...
- 洛谷--橙色百道DP总结
最近刷完了洛谷橙色DP大约一百道,算是发现了一些套路,就部分题目做一些总结. 大概分为三类 第一类,九大背包及其衍生 第二类,经典DP模型,如LCS,LIS等 第三类,实际问题背景的普通,环形,树上D ...
- 洛谷-题解 P2672 【推销员】
独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...
- 洛谷 P1142 轰炸
洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...
最新文章
- jfinal整合shiro回顾
- 2018年Spring Cloud中国社区技术沙龙-成都站
- Java程序员的日常—— 《编程思想》关于类的使用常识
- console 非常实用的方法
- VTK:几何对象之PlanesIntersection
- 最小径集的算法_如何为数据集选择正确的聚类算法?
- 【东软实训】SQL多表链接
- CTabCtrl控件标签的相关设置
- Google谷歌通过地址计算两地距离 HOW TO CALCULATE DRIVING DISTANCE BETWEEN 2 LOCATIONS
- windows2003密码忘记了该如何处理
- 致凯利定理(Cayley公式)
- 手把手教你搭建SpringCloud项目(二)生产者与消费者
- 拳王虚拟项目公社:新媒体多渠道变现,生财有道?
- 用gfortran编译C和Fortran
- 【小常识】打印机身份证双面打印方法
- Springboot宠物医院系统
- 顺芯ES8374单声道codec音频解码芯片,集成功放IC
- 在VS中怎么用vb画矩形_怎样画颜色绚丽的插画?
- RTP载荷H265(实战细节)
- java8 access_Java语言8 连接Access数据库UCanAccess的操作介绍
热门文章
- 小程序--错误{errcode:40029,errmsg:invalid code, hints: [ req_id: weh8ka0297hc58 ]}
- 【Audio音频兴趣拓展】音频功放的输入信号可以是数字信号吗
- python中list的意思_python中的list是什么
- 每天一个linux命令(4):mkdir命令
- 6-Ubuntu与Windows不能相互复制
- vue开发常用css,js(持续更新)
- SAP FI系统配置-应收应付
- S型函数:Sigmoid 函数
- 基于Java实现的用于计算个人所得税的程序
- oracle导出exp步骤,oracle数据导出导入(exp/imp)