UVa-101 The Blocks Problem(栈模拟)

来源:互联网 发布:南平seo快速优化软件 编辑:程序博客网 时间:2024/06/06 18:09

题意:给出n个数字(0到n-1),有四种操作:

move a onto b:  把a上的数字回到初始位置,把b上的数字回到初始位置,把a移动到b上

move a over b:把a上的数字回到初始位置,把a移动到b上

move a onto b:把b上的数字回到初始位置,把a和a上的数字一起移动到b上,a和a上的数字顺序不变

move a over b:把a和a上的数字一起移动到b上最顶层的数字上,a和a上的数字顺序不变

分析:用栈来模拟操作

#include <iostream>  #include <stack>  #include <string>  #include <stdio.h>  using namespace std;  stack<int> st[35];int pos[35];int n;int main(){char a[60], b[60];int x, y;cin>>n;for(int i = 0; i<n; i++){st[i].push(i);pos[i] = i;}while(scanf("%s", a)==1){if(a[0] == 'q') break;scanf("%d %s %d", &x, b, &y);if(pos[x] == pos[y]) continue;if(a[0] == 'm'){if(b[1] == 'n'){while(st[pos[x]].top()!=x){st[st[pos[x]].top()].push(st[pos[x]].top());pos[st[pos[x]].top()] = st[pos[x]].top(); //这里一开始不记得回到原来位置,re了半天st[pos[x]].pop();}while(st[pos[y]].top()!=y){st[st[pos[y]].top()].push(st[pos[y]].top());pos[st[pos[y]].top()] = st[pos[y]].top();st[pos[y]].pop();}st[pos[y]].push(x);st[pos[x]].pop();pos[x] = pos[y];}else if(b[1] == 'v'){while(st[pos[x]].top()!=x){st[st[pos[x]].top()].push(st[pos[x]].top());pos[st[pos[x]].top()] = st[pos[x]].top();st[pos[x]].pop();}st[pos[y]].push(x);st[pos[x]].pop();pos[x] = pos[y];}}else if(a[0] == 'p'){if(b[1] == 'n'){    int temp[35];    int k = 0;    while(st[pos[y]].top()!=y){    st[st[pos[y]].top()].push(st[pos[y]].top());    pos[st[pos[y]].top()] = st[pos[y]].top();    st[pos[y]].pop();    }        while(st[pos[x]].top()!=x){    temp[k++] = st[pos[x]].top();    st[pos[x]].pop();}temp[k] = x;st[pos[x]].pop();for(int i = k; i>=0; i--){st[pos[y]].push(temp[i]);pos[temp[i]] = pos[y];}    }        else if(b[1] == 'v'){    int temp[60];    int k = 0;    while(st[pos[x]].top()!=x){    temp[k++] = st[pos[x]].top();    st[pos[x]].pop();}temp[k] = x;st[pos[x]].pop();for(int i = k; i>=0; i--){st[pos[y]].push(temp[i]);pos[temp[i]] = pos[y];}}}}for(int i = 0; i<n; i++){int temp[60], k = 0;while(st[i].size()){temp[k++] = st[i].top();st[i].pop();}printf("%d:", i);for(int j = k-1; j>=0; j--){printf(" %d", temp[j]);}printf("\n");}return 0;}

原创粉丝点击