UVA101 【The Blocks Problem】

一个大模拟!!!

总的来说就是碰到move就要把a上面的全部放回原处。

如果碰到onto就要把b上面的全部放到原处。
因为move是只移动a一个,所以a上面的要归位,而pile是移一堆,所以不用。

onto是要和b贴在一起,所以b上面的要归位,而over是上方,不需要直接接触,所以不用。。

思路就是用栈来模拟,一开始就是n个栈。每个栈里都是一个元素,然后按照指令移,在这个栈里pop()掉它,在另一个栈里push()进去。。
分四种情况来做移动,每种情况处理方式不一样。要注意如果是一堆移过去,因为还是要按照这个顺序,多以要先把这一堆放到另一个数组,再按顺序push进去。
模拟完输出即可。。

CODE:

#include<iostream>  
#include<cstdio>  
#include<string>  
#include<stack>  

using namespace std;  

stack <int> sta[100];  
int t,num[100];  
int res[100];  
string m1,m2;  
int p1,p2;  
  
int main () {  
    cin >> t;  
    getchar();  
    for( int i = 0; i < t ;i++) {  
        sta[i].push(i);  
        num[i] = i;  
  
    }  
    while(1) {  
        cin >> m1;  
        if(m1 == "quit")  
            break;  
        cin >>p1 >>m2 >>p2;  
        if (num[p1] == num[p2])  
            continue;  
        if (m1 == "move" && m2 == "over") {  
            for (;sta[num[p1]].top() != p1; ) {  
                sta[ sta[num[p1]].top() ].push(sta[num[p1]].top());   
                num[sta[num[p1]].top()] = sta[num[p1]].top();  
                sta[num[p1]].pop();  
            }  
            sta[num[p2]].push(p1);  
            sta[num[p1]].pop();  
            num[p1] = num[p2];  
        }  
        if (m1 == "pile" && m2 == "over") {  
            int k = 0;  
            int temp[200];  
            for (;sta[num[p1]].top() != p1; ) {  
                temp[k++] = sta[num[p1]].top();  
                num[sta[num[p1]].top()] = num[p2];  
                sta[num[p1]].pop();  
            }  
            sta[num[p1]].pop();  
            temp[k] = p1;  
            num[p1] = num[p2];  
            for(int w = k ;w >= 0; w--)  
                sta[num[p2]].push(temp[w]);  
        }  
        if (m1 == "move" && m2 == "onto") {  
            for (;sta[num[p1]].top() != p1; ) {  
                sta[ sta[num[p1]].top() ].push(sta[num[p1]].top());   
                num[sta[num[p1]].top()] = sta[num[p1]].top();  
                sta[num[p1]].pop();  
            }  
            for (;sta[num[p2]].top() != p2; ) {  
                sta[ sta[num[p2]].top() ].push(sta[num[p2]].top());   
                num[sta[num[p2]].top()] = sta[num[p2]].top();  
                sta[num[p2]].pop();  
            }  
            sta[num[p2]].push(sta[num[p1]].top());  
            sta[num[p1]].pop();  
            num[p1] = num[p2];  
        }  
        if (m1 == "pile" && m2 == "onto") {  
            int k = 0;  
            int temp[200];  
            for (;sta[num[p1]].top() != p1; ) {  
                temp[k++] = sta[num[p1]].top();  
                num[sta[num[p1]].top()] = num[p2];  
                sta[num[p1]].pop();  
            }  
            sta[num[p1]].pop();  
            temp[k] = p1;  
            num[p1] =num[p2];  
            for (;sta[num[p2]].top() != p2; ) {  
                sta[ sta[num[p2]].top() ].push(sta[num[p2]].top());   
                num[sta[num[p2]].top()] = sta[num[p2]].top();  
                sta[num[p2]].pop();  
            }  
            for(int w = k ;w >= 0; w--)  
                sta[num[p2]].push(temp[w]);  
          
        }  
    }  
    int j;  
    for(int i = 0;i < t;i++) {  
        cout << i <<":";  
        for( j = 0 ;!sta[i].empty();j++) {  
            res[j] =  sta[i].top();  
            sta[i].pop();  
        }  
        for (j = j -1; j >= 0;j--)  
            cout<<" "<<res[j];  
        cout << endl;  
    }  
    return 0;  
}  


转载于:https://www.cnblogs.com/Repulser/p/9813291.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值