uva 101

来源:互联网 发布:在线教育cms 编辑:程序博客网 时间:2024/05/02 09:32

数据结构+模拟~

题意大概有N个木块,有4种操作。

move a onto b 将a木块和b木块上面的木块移回最开始的地方(这个最坑了,英语真心一开始木有看懂。)然后把a移到b上面。

move a over b 只把a木块上面的木块移到原来的位置,然后把a移到有b的一堆木块上即可(不论b是否是最上面)

pile a onto b 把a和a上面的一堆木块移动到b上面,b上面的木块移回到最初的位置。

pile a over b 把a上面的一堆移动到b上面的一堆。

AC代码:

#include<cstdio>#include<cstring>#include<stack>using  namespace std;const int MAXN=30;int place[MAXN];                                //存每个木块的位置stack<int>sta[MAXN];                            //每一堆用栈表示void move_onto(int a,int b){                    //模拟move onto的操作    while(sta[place[b]].top()!=b){              //将b上面的木块移回原来的位置,记得改变place,和清除已移动的木块        int temp=sta[place[b]].top();        sta[place[b]].pop();        sta[temp].push(temp);        place[temp]=temp;    }    while(sta[place[a]].top()!=a){        int temp=sta[place[a]].top();        sta[place[a]].pop();        sta[temp].push(temp);        place[temp]=temp;    }    sta[place[a]].pop();    place[a]=place[b];    sta[place[b]].push(a);}void move_over(int a,int b){               //只用移动a的,然后放在有b的堆上面    while(sta[place[a]].top()!=a){        int temp=sta[place[a]].top();        sta[place[a]].pop();        sta[temp].push(temp);        place[temp]=temp;    }    sta[place[a]].pop();    place[a]=place[b];    sta[place[b]].push(a);}void pile_onto(int a,int b){    while(sta[place[b]].top()!=b){        int temp=sta[place[b]].top();        sta[place[b]].pop();        sta[temp].push(temp);        place[temp]=temp;    }    int temp[MAXN],m=0;    while(1){                                    //临时存一个数组将要移动的一堆记录,stack只能从顶端入,顶端出,要有中间过一次        temp[m++]=sta[place[a]].top();        sta[place[a]].pop();        place[temp[m-1]]=place[b];        if(temp[m-1]==a) break;    }    for(int i=m-1;i>=0;i--) sta[place[b]].push(temp[i]);}void pile_over(int a,int b){    int temp[MAXN],m=0;    while(1){        temp[m++]=sta[place[a]].top();        sta[place[a]].pop();        place[temp[m-1]]=place[b];        if(temp[m-1]==a) break;    }    for(int i=m-1;i>=0;i--) sta[place[b]].push(temp[i]);}int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    memset(place,0,sizeof(place));    int n;    scanf("%d",&n);    char a[6],b[6];    int c,d;    for(int i=0;i<n;i++){                   //初始化        place[i]=i;        sta[i].push(i);    }    while(~scanf("%s",a)){        if(strcmp(a,"quit")==0) break;        scanf("%d%s%d",&c,b,&d);        if(place[c]==place[d]) continue;       // printf("%s %d %s %d\n",a,c,b,d);        if(strcmp(a,"move")==0 && strcmp(b,"onto")==0)      move_onto(c,d);        else if(strcmp(a,"move")==0 && strcmp(b,"over")==0) move_over(c,d);        else if(strcmp(a,"pile")==0 && strcmp(b,"onto")==0) pile_onto(c,d);        else if(strcmp(a,"pile")==0 && strcmp(b,"over")==0) pile_over(c,d);    }    int temp[MAXN];    for(int i=0;i<n;i++){                    //输出时也要先存到临时数组里输出        int  m=0;        printf("%d:",i);        while(!sta[i].empty()) {temp[m++]=sta[i].top();sta[i].pop();}        for(int j=m-1;j>=0;j--) printf(" %d",temp[j]);        printf("\n");    }    return 0;}


 


 

 

 

 


 

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 扭了脚肿起来了怎么办 发际线低额头窄怎么办 档案写错了涂改怎么办 当时档案写错了怎么办 档案内容写错了怎么办 高中档案写错了怎么办 上大学档案丢了怎么办 u盘总提示格式化怎么办 黑莓手机id锁了怎么办 美图手机进水了怎么办 球兰叶子发黄软怎么办 蟹爪莲叶子发红怎么办 保险箱没电了打不开怎么办 宁波臭冬瓜酸的怎么办 甜酒酿做了酸了怎么办 孕妇喝了醪糟汤怎么办 鱼侧翻但又没死怎么办 原汁机盖子卡死怎么办 惠人原汁机坏了怎么办 泡芙鸡蛋加多了怎么办 淡奶油打过了怎么办 淡奶油打发过了怎么办 雷神锤子被捏碎怎么办 私处毛很多很黑怎么办 脸上长黑色的毛怎么办 十字军之王2毁容怎么办 多囊卵巢综合症想怀孕怎么办 12306账户名忘了怎么办 丧尸病毒爆发了怎么办 看了鬼故事害怕怎么办 微信验证码忘了怎么办 微拉美后脸变形怎么办 感情不好心好累怎么办 刚买乌龟不吃食怎么办 新小乌龟不吃食怎么办 吃太多了好难受怎么办 已经吃了苦丝瓜怎么办 墨兰叶子尖发黄怎么办 气膜建筑停电了怎么办 脖子转一下就痛怎么办 手抄报空的地方怎么办