概述
题意:给出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;
}
最后
以上就是殷勤石头为你收集整理的UVa-101 The Blocks Problem(栈模拟)的全部内容,希望文章能够帮你解决UVa-101 The Blocks Problem(栈模拟)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复