紫书章五例二 木块问题 UVA 101(vector)

来源:互联网 发布:u盘启动ubuntu系统 编辑:程序博客网 时间:2024/06/07 02:50

这一道题主要是vector的应用。我们经常用的有 vector a
a.push_back() 尾查
a.pop_back() 尾删
a.size() a的长度
a.resize(h+1) a 只保留0-h 的元素
a.clear() 清空a
a.empty() 判断a是否为空
还可以直接赋值
题意为:
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 停止
然后如果ab在同一堆的话,则不操作

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <vector>using namespace std;int vis[30];int z[30];char s[10],s2[10];int n;vector <int > v[30];void init(){    for(int i=0;i<n;i++){        vis[i]=i;        v[i].push_back(i);    }}int main(){  //  freopen("E:\\input.txt","r",stdin);    scanf("%d",&n);    init();    for(;;){        scanf("%s",s);        if(s[0]=='q') break;        int a,b;         scanf("%d %s %d",&a,s2,&b);         int k1=vis[a],k2=vis[b];        if(k1==k2) continue;        if(s[0]=='m')        {            for(int i=v[k1].size()-1;i>=0;i--){//将a上的还原                int g=v[k1][i];                if(g==a) {v[k1].pop_back();break;}                else {                    vis[g]=g;                    v[g].push_back(g);                    v[k1].pop_back();                }            }            if(s2[1]=='n'){                for(int i=v[k2].size()-1;i>=0;i--){//将b上的还原                    int g=v[k2][i];                    if(g==b) break;                    else {                        vis[g]=g;                        v[g].push_back(g);                        v[k2].pop_back();                    }                }            }            v[k2].push_back(a);            vis[a]=k2;        }        else if(s[0]=='p'){            memset(z,0,sizeof(z));            int h=0;            for(int i=v[k1].size()-1;i>=0;i--){//a上取出                 int g=v[k1][i];                 if(g==a){z[h++]=a;vis[a]=k2;v[k1].pop_back();break;}//这里不要忘记将a标记啊啊啊啊                 else                 {                     z[h++]=g;                     vis[g]=k2;                     v[k1].pop_back();                 }            }            if(s2[1]=='n'){                for(int i=v[k2].size()-1;i>=0;i--){//将b上还原                    int g=v[k2][i];                    if(g==b){break;}                    else {                        vis[g]=g;                        v[g].push_back(g);                        v[k2].pop_back();                    }                }            }            for(int i=h-1;i>=0;i--)                v[k2].push_back(z[i]);        }    }    for(int i=0;i<n;i++){            printf("%d:",i);            for(int j=0;j<v[i].size();j++){                printf(" %d",v[i][j]);            }            printf("\n");        }    return 0;}
0 0
原创粉丝点击