用 栈 stack 来模拟
题目意思:http://blog.csdn.net/mobius_strip/article/details/12765319
下面的代码有坑,输出格式需要调。
#include<stdio.h>
#include<iostream>
#include<stack>
#include<string.h>
#include<stdlib.h>
using namespace std;
const int maxn=25+5;
stack<int >s[maxn];
int pos[maxn];
int main()
{
int n;
string s1,s2;
int a,b;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
s[i].push(i);
pos[i]=i;
}
while(cin>>s1)
{
if(s1[0]==‘q‘)
break;
cin>>a>>s2>>b;
if(s1=="move"&&s2=="onto")
{
while(s[pos[a]].top()!=a)
{
int temp=s[pos[a]].top();
s[temp].push(temp);
pos[temp]=temp;
s[pos[a]].pop();
}
while(s[pos[b]].top()!=b)
{
int temp=s[pos[b]].top();
s[temp].push(temp);
pos[temp]=temp;
s[pos[b]].pop();
}
s[pos[a]].pop();
s[pos[b]].push(a);
pos[a]=pos[b];
printf("1=====\n");
}
if(s1=="move"&&s2=="over")
{
while(s[pos[a]].top()!=a)
{
int temp=s[pos[a]].top();
s[temp].push(temp);
pos[temp]=temp;
s[pos[a]].pop();
}
s[pos[a]].pop();
s[pos[b]].push(a);
pos[a]=pos[b];
printf("2=====\n");
}
if(s1=="pile"&&s2=="onto")
{
while(s[pos[b]].top()!=b)
{
int temp=s[pos[b]].top();
s[temp].push(temp);
pos[temp]=temp;
s[pos[b]].pop();
}
stack<int >s_temp;
while(s[pos[a]].top()!=a)
{
int temp=s[pos[a]].top();
s_temp.push(temp);
pos[temp]=pos[b];
s[pos[a]].pop();
}
s[pos[a]].pop();
s[pos[b]].push(a);
pos[a]=pos[b];
while(!s_temp.empty())
{
int temp=s_temp.top();
s[pos[b]].push(temp);
s_temp.pop();
}
printf("3=====\n");
}
if(s1=="pile"&&s2=="over")
{
stack<int >s_temp;
while(s[pos[a]].top()!=a)
{
int temp=s[pos[a]].top();
s_temp.push(temp);
pos[temp]=pos[b];
s[pos[a]].pop();
}
s[pos[a]].pop();
s[pos[b]].push(a);
pos[a]=pos[b];
while(!s_temp.empty())
{
int temp=s_temp.top();
s[pos[b]].push(temp);
s_temp.pop();
}
printf("4=====\n");
}
}
for(int i=0;i<n;i++)
{
printf("%d:",i);
while(!s[i].empty())
{
printf(" %d",s[i].top());
s[i].pop();
}
printf("\n");
}
return 0;
}
uva 101 - The Blocks Problem,布布扣,bubuko.com
原文:http://blog.csdn.net/u013382399/article/details/25699389