码迷,mamicode.com
首页 > 其他好文 > 详细

UVA101 【The Blocks Problem】

时间:2018-10-18 23:53:05      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:tchar   getc   开始   处理   cpp   stack   输出   move   bre   

一个大模拟!!!

总的来说就是碰到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;  
}  


UVA101 【The Blocks Problem】

标签:tchar   getc   开始   处理   cpp   stack   输出   move   bre   

原文地址:https://www.cnblogs.com/Repulser/p/9813291.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!