uvaoj 101 - The Blocks Problem(vector应用+技巧)
木块问题,模拟堆的操作。每个堆的高度不确定,用vector来做很合适(vector动态)。
本题模拟四个操作:
1.move a onto b:把a和b上方的木块全部放回原来的堆,然后把a摞在b上面
2.move a over b:把a上方的木块全部放回原来的堆,然后把a放在b所在木块堆的顶部
3.pile a onto b:把b上方的木块全部放回原来的堆,然后把a及上面的木块整体摞在b上面。
4.pile a over b:把a及上面的木块整体摞在b所在木块堆的顶部。
这里有一个技巧:四种指令完全独立处理会使代码变得复杂,容易出错。所以可以提取出他们之间的共同点,以减少重复代码。
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int n;
vector<int> pile[maxn];//每个pile[i]是一个vector
//找木块a所在的pile和height,以引用的形式返回调用者
void find_block(int a,int& p,int& h)
{
for(p=;p<n;p++)
{
for(h=;h<pile[p].size();h++)
{
if(pile[p][h]==a)return;
}
}
}
//第P堆高度为h的木块上方的所有木块移回原位
void clear_above(int p,int h)
{
for(int i=h+;i<pile[p].size();i++)
{
int b=pile[p][i];
pile[b].push_back(b);
}
pile[p].resize(h+);//第p堆只保留下标在0~h之间的元素
}
//把第p堆高度为h及其上方的木块整体移动到p2堆
void pile_onto(int p,int h,int p2)
{
for(int i=h;i<pile[p].size();i++)
{
pile[p2].push_back(pile[p][i]);
}
pile[p].resize(h);//第p堆只保留下标在0~h-1之间的元素
}
//打印函数
void print()
{
for(int i=;i<n;i++)
{
printf("%d:",i);
for(int j=;j<pile[i].size();j++)printf(" %d",pile[i][j]);
printf("\n");
}
}
int main()
{
int a,b;
cin>>n;
string s1,s2;
for(int i=;i<n;i++)pile[i].push_back(i);//初始化,给木块赋上相应对的编号
while(cin>>s1)
{
if(s1!="quit")cin>>a>>s2>>b;
else break;
int pa,pb,ha,hb;
find_block(a,pa,ha);
find_block(b,pb,hb);
if(pa==pb)continue;
if(s2=="onto")clear_above(pb,hb);
if(s1=="move")clear_above(pa,ha);
pile_onto(pa,ha,pb);
}
print();
return ;
}
uvaoj 101 - The Blocks Problem(vector应用+技巧)的更多相关文章
- UVa 101 The Blocks Problem Vector基本操作
UVa 101 The Blocks Problem 一道纯模拟题 The Problem The problem is to parse a series of commands that inst ...
- UVa 101 - The Blocks Problem(积木问题,指令操作)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
- POJ 1208 The Blocks Problem --vector
http://poj.org/problem?id=1208 晚点仔细看 https://blog.csdn.net/yxz8102/article/details/53098575 #include ...
- UVa 101 The Blocks Problem
题意:给出从左到右放置的n块木块(从0开始编号),再给出四种操作,再给出相应的操作,输出操作结束后每一堆木块的情况. 学习的紫书,因为每一堆的木块数是在发生变化的,所以用vector. 然后就是模拟几 ...
- UVa 101 - The Blocks Problem STL
题目:给你n个方块,有四种操作: .move a onto b,把a和b上面的方块都放回原来位置,然后把a放到b上面: .move a over b,把a上面的放回原处,然后把a放在b所在的方块堆的上 ...
- 【UVA - 101】The Blocks Problem(vector+模拟)
The Blocks Problem Descriptions:(英语就不说了,直接上翻译吧) 初始时从左到右有n个木块,编号为0~n-1,要求实现下列四种操作: move a onto b: 把a和 ...
- 木块问题(The Blocks Problem,Uva 101)
不定长数组:vector vector就是一个不定长数组.不仅如此,它把一些常用操作“封装”在了vector类型内部. 例如,若a是一个vector,可以用a.size( )读取它的大小,a.resi ...
- The Blocks Problem(vector)
题目链接:http://poj.org/problem?id=1208 The Blocks Problem Time Limit: 1000MS Memory Limit: 10000K Tot ...
- UVa101 The Blocks Problem(不定长数组vector)
The Blocks Problem 书上的一道例题,代码思路比较清晰,可以看懂. 相关知识: 若a是一个vector,则: a.size():读取它的大小 a.resize():改变大小 a.pus ...
随机推荐
- nodejs中的fiber(纤程)库详解
fiber/纤程 在操作系统中,除了进程和线程外,还有一种较少应用的纤程(fiber,也叫协程).纤程常常拿来跟线程做对比,对于操作系统而言,它们都是较轻量级的运行态.通常认为纤程比线程更为轻量,开销 ...
- 【题解】洛谷P1514 [NOIP2010TG] 引水入城(DFS+DP)
次元传送门:洛谷P1514 思路 可以证明如果有解 那么每个蓄水池可以覆盖到的干旱区必定是线段 证明: 举个栗子 8 9 8 7 9 7 6 9 6 明显到不了中间的点 如果不是连续的线段 中间肯定有 ...
- iOS应用软件沙盒sandbox相关知识(整理)
1.iOS沙盒机制原理 iOS应用程序只能在该程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. ...
- lable随堂笔记
lable标签与属性 lable标签:for属性,让标签与指定的input元素建立标签:将input元素包含在lable标签中. <table border="2" alig ...
- OC - KVO实现原理
1.KVO简介 KVO是Objective-C对观察者设计模式的一种实现,它提供一种机制,指定一个被观察对象(如A类),当对象中的某个属性发生变化的时候,对象就会接收到通知,并作出相应的处理.在MVC ...
- 12种开源Web安全扫描程序
转自:https://blog.csdn.net/wh211212/article/details/78620963 赛门铁克的一个有趣的报告显示,76%的被扫描网站有恶意软件 如果您使用的是Word ...
- #leetcode刷题之路8-字符串转换整数 (atoi)
请你来实现一个 atoi 函数,使其能将字符串转换成整数.首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止.当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面 ...
- chromium之message_pump_win之三
上一篇分析MessagePumpForUI,参考chromium之message_pump_win之二 MessagePumpForIO,同MessagePumpForUI,也是要实现三个函数 // ...
- Resharp常用设置收集整理
F12跳转的问题:
- linux系统基础之--进程计划(基于centos7.4 1708)