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() 函数取的是尾元素地址的下一个地址。(左闭右开)

 


 


题目翻译:https://www.cnblogs.com/sky-stars/p/10988706.html

题目大意:

初始时从左到右有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

C++STL

UVA101 The Blocks Problem

UVa Where is the Marble? (STL)

例题6-2(Rails, UVa 514)

uva 1592 Database (STL)