STL:Vector 例题:UVA 101(积木问题) The Blocks Problem
Posted master-fiora
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL:Vector 例题:UVA 101(积木问题) The Blocks Problem相关的知识,希望对你有一定的参考价值。
vetor常用函数引自:https://blog.csdn.net/qq_42070580/article/details/96773579
这里只展示些vector的一些常用函数:
1.push_back()
顾名思义,push_back(x)就是在vector后面添加一个元素x。
2.pop_back()
有添加就有删除,pop_back()用于删除vector的尾元素,时间复杂度为O(1)。
3.size()
size()用来获取vector中元素的个数,时间复杂度为O(1)。size()返回的是unsignedl类型,不过一般来说用%d不会出现很大的问题,这一点对所有STL容器都是一样的。
4.clear()
clear()用来清空vector中所有元素,时间复杂度为O(N),其中N为vector中元素的个数。
5.insert()
insert(it,x)用来向vector的任意迭代器it处插入一个元素X,时间复杂度为O(N)。
6.erase()
有两种用法:删除单个元素,删除一个区间的所有元素。时间复杂度均为O(N).
①删除单个元素。
serase(it)即删除迭代器为it处的元素。
②删除一个区间内的所有元素。
erase(frist, last)即删除[frist, last) 内的所有元素。
begin()函数的作用为取vi的首元素地址。end() 函数取的是尾元素地址的下一个地址。(左闭右开)
题目大意:
初始时从左到右有n个木块,编号为0~n-1,要求实现下列四种操作:
- move a onto b: 把a和b上方的木块全部放回初始的位置,然后把a放到b上面
- move a over b: 把a上方的木块全部放回初始的位置,然后把a放在b所在木块堆的最上方
- pile a onto b: 把b上方的木块部放回初始的位置,然后把a和a上面所有的木块整体放到b上面
- pile a over b: 把a和a上面所有的木块整体放在b所在木块堆的最上方
一组数据的结束标志为"quit",如果有非法指令(a和b在同一堆),应当忽略。
输入
输入由1个整数n开始开始,该整数独占一行,表示积木世界中的积木数量。你可以假定0 < n < 25。 从积木数量值的下一行开始是一系列的命令,每条命令独占一行。你的程序要处理所有的命令直到输入退出命令。 你可以假定所有的命令都按上文所示的格式给出。不会出现语法错误的命令。
输出
以积木世界的最终状态作为输出。每一个原始积木的位置i(0 ≤ i < n,n为积木数量)后面都要紧跟一个冒号。
如果至少有一个积木在该位置上,冒号后面都要紧跟一个空格,然后是该位置上所有积木编号的序列。每2个积木的编号之间以一个空格隔开。行尾不能出现多余的空格。 每个积木位置独占一行(即第一行输入的n,对应输出n行数据)。
样例输入
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.关于zht[][]数组的问题 pile 一组数据a过去后再release时是当前已更新的zht !! 所以在使用一个变量时应该多关注其状态有没有改变
1 void release(int m){ 2 int i=zht[m][0],j=zht[m][1]; 3 while(a[i].size()-1>j){int x=a[i][a[i].size()-1]; a[i].pop_back(); zht[x][0]=x; zht[x][1]=0; a[x].push_back(x); } 4 } 5 6 void moved(string s,int m,string cmd,int n){ 7 if(zht[m][0]==zht[n][0]) return; 8 if (s[0]==‘m‘) release(m); 9 if (cmd[1]==‘n‘) release(n); 10 11 int ia=zht[m][0],ib=zht[n][0],ja=zht[m][1]; 12 int x1=zht[m][1]-1; 13 while(ja<a[ia].size()){ 14 int x=a[ia][ja]; 15 a[ib].push_back(x); zht[x][0]=ib; zht[x][1]=a[ib].size()-1; 16 ja++; 17 } 18 19 if (x1!=-1) release(a[ia][x1]); else { release(m); a[ia].pop_back(); } //此时release的zht中记录的是已经更新后的zht,因此要换一种做法 20 } 21
2.注意输出的格式 :后要空格
3.vector.size()返回的是unsigned类型,不能赋值为-1,会变成最大值,同时在与非unsigned比较时会自动将其转换为unsigned类型,因此在与-1比较时需要强制转换为(int)类型
while((int)a[ia].size()-1>x1) a[ia].pop_back();
AC代码
#include<bits/stdc++.h> using namespace std; int n0; int zht[30][2];//记录此时积木的位置 vector <int> a[30]; int reads(string m){//将字符转化为数字 int a=0; for (int i=0;i<m.length();i++) a=a*10+m[i]-48; return a; } void release(int m){//将m号积木上方积木放回原位 int i=zht[m][0],j=zht[m][1]; while(a[i].size()-1>j){int x=a[i][a[i].size()-1]; a[i].pop_back(); zht[x][0]=x; zht[x][1]=0; a[x].push_back(x); } } void moved(string s,int m,string cmd,int n){ if(zht[m][0]==zht[n][0]) return; if (s[0]==‘m‘) release(m); if (cmd[1]==‘n‘) release(n); int ia=zht[m][0],ib=zht[n][0],ja=zht[m][1]; int x1=zht[m][1]-1; while(ja<a[ia].size()){ int x=a[ia][ja]; a[ib].push_back(x); zht[x][0]=ib; zht[x][1]=a[ib].size()-1; ja++; } while((int)a[ia].size()-1>x1) a[ia].pop_back();//移动过的积木清除 } int main(){ cin>>n0; string s,cmd; int m=0,n=0; for (int i=0;i<=n0;i++) {zht[i][0]=i; zht[i][1]=0; a[i].push_back(i);} while(cin>>s,s!="quit"){ string cmd,a1,b1; cin>>a1>>cmd>>b1; m=reads(a1);n=reads(b1); moved(s,m,cmd,n); } for (int i=0;i<n0;i++) { cout<<i<<":"; for(int j=0;j<a[i].size();j++) cout<<" "<<a[i][j]; cout<<endl; } return 0; }
2019-12-20
以上是关于STL:Vector 例题:UVA 101(积木问题) The Blocks Problem的主要内容,如果未能解决你的问题,请参考以下文章
UVa 101 - The Blocks Problem STL