您的位置:首页 > 其它

UVa-101 The Blocks Problem(栈模拟)

2017-08-28 23:26 369 查看
题意:给出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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: