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

输入输出样例

输入样例#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[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之积木问题相关推荐

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

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

  2. 洛谷P2342-叠积木

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

  3. 洛谷P5274 优化题(ccj)

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

  4. 01背包的应用~洛谷P1504 积木城堡

    题目描述 XC 的儿子小 XC 最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木. 小 XC 是一个比他爸爸 XC 还聪明的孩子,他发现垒城堡的时候,如果下面的 ...

  5. 洛谷 P1504 积木城堡

    洛谷 P1504 积木城堡 题目 题目描述 XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡 ...

  6. 洛谷 深基 第4部分 基础数学与数论(19-21课)

    洛谷 深基 第4部分 基础数学与数论  第19章 位运算与进制转换 P1143 进制转换 https://www.luogu.com.cn/problem/P1143 洛谷P1143 进制转换的Pyt ...

  7. 洛谷--橙色百道DP总结

    最近刷完了洛谷橙色DP大约一百道,算是发现了一些套路,就部分题目做一些总结. 大概分为三类 第一类,九大背包及其衍生 第二类,经典DP模型,如LCS,LIS等 第三类,实际问题背景的普通,环形,树上D ...

  8. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  9. 洛谷 P1142 轰炸

    洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...

最新文章

  1. jfinal整合shiro回顾
  2. 2018年Spring Cloud中国社区技术沙龙-成都站
  3. Java程序员的日常—— 《编程思想》关于类的使用常识
  4. console 非常实用的方法
  5. VTK:几何对象之PlanesIntersection
  6. 最小径集的算法_如何为数据集选择正确的聚类算法?
  7. 【东软实训】SQL多表链接
  8. CTabCtrl控件标签的相关设置
  9. Google谷歌通过地址计算两地距离 HOW TO CALCULATE DRIVING DISTANCE BETWEEN 2 LOCATIONS
  10. windows2003密码忘记了该如何处理
  11. 致凯利定理(Cayley公式)
  12. 手把手教你搭建SpringCloud项目(二)生产者与消费者
  13. 拳王虚拟项目公社:新媒体多渠道变现,生财有道?
  14. 用gfortran编译C和Fortran
  15. 【小常识】打印机身份证双面打印方法
  16. Springboot宠物医院系统
  17. 顺芯ES8374单声道codec音频解码芯片,集成功放IC
  18. 在VS中怎么用vb画矩形_怎样画颜色绚丽的插画?
  19. RTP载荷H265(实战细节)
  20. java8 access_Java语言8 连接Access数据库UCanAccess的操作介绍

热门文章

  1. 小程序--错误{errcode:40029,errmsg:invalid code, hints: [ req_id: weh8ka0297hc58 ]}
  2. 【Audio音频兴趣拓展】音频功放的输入信号可以是数字信号吗
  3. python中list的意思_python中的list是什么
  4. 每天一个linux命令(4):mkdir命令
  5. 6-Ubuntu与Windows不能相互复制
  6. vue开发常用css,js(持续更新)
  7. SAP FI系统配置-应收应付
  8. S型函数:Sigmoid 函数
  9. 基于Java实现的用于计算个人所得税的程序
  10. oracle导出exp步骤,oracle数据导出导入(exp/imp)