终于AC了,这道题目去年寒假卡得我要死,最后一气之下就不做了。。。想想居然一年之久了,我本来都快忘了这道题了,最近发现白书的奥秘,觉得刘汝佳的题目真的相当练思维以及对代码的操作,决定又刷起题目来,这时候才想起这道题。

用栈进行模拟堆砖块,用个rec[]数组记录其现在所在的栈号,比较麻烦的是pile 操作,为了把a以及a以上的所有砖块都以原秩序放置于b砖块顶端,我用了个临时的栈进行存贮,然后再一个一个放到b栈上面。。这样就不会破坏秩序。。但是感觉这样做挺耗时的,原以为通不过,结果还是通过了。。。22ms,也不算太高吧。。不知道还有没有更好的pile方法

这个题目去年我都没想清楚题意,题目里面有个关键词 initial,意味着所有操作要还原的砖块都应该还原到它原本的位置,即 1还原到1号栈 2还原到2号栈,依次类推,因为根据题目的意思以及几大操作分析,一个栈要么就没元素,要么栈底元素就是栈号对应的元素,一旦移走了,栈必为空,一旦要还原,必定就把还原成最原始的样子

。一年了,觉得自己思维进步了一些,这是好事,继续加油!

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#define N 35
using namespace std;
stack <int> arr[N];
int rec[N];
int n,a,b;
char ch1[],ch2[];
void solve()
{
int temp=arr[rec[a]].top();;
int t2=arr[rec[b]].top();
if (temp==t2) return;
if (ch1[]=='m' && ch2[]=='n')
{ while (temp!=a)
{
arr[temp].push(temp);
rec[temp]=temp;
arr[rec[a]].pop();
temp=arr[rec[a]].top();
} while (t2!=b)
{
arr[t2].push(t2);
rec[t2]=t2;
arr[rec[b]].pop();
t2=arr[rec[b]].top();
}
arr[rec[b]].push(a);
arr[rec[a]].pop();
rec[a]=rec[b];
return;
}
if (ch1[]=='m' && ch2[]=='v')
{ while (temp!=a)
{
arr[temp].push(temp);
rec[temp]=temp;
arr[rec[a]].pop();
temp=arr[rec[a]].top();
}
arr[rec[b]].push(a);
arr[rec[a]].pop();
rec[a]=rec[b];
return;
}
if (ch1[]=='p' && ch2[]=='n')
{ while (t2!=b)
{
arr[t2].push(t2);
rec[t2]=t2;
arr[rec[b]].pop();
t2=arr[rec[b]].top();
}
stack <int> q;
while (temp!=a)
{
q.push(temp);
arr[rec[a]].pop();
temp=arr[rec[a]].top();
}
arr[rec[b]].push(temp);
arr[rec[a]].pop();
rec[a]=rec[b];
while (!q.empty())
{
int tt=q.top();
q.pop();
rec[tt]=rec[b];
arr[rec[b]].push(tt);
}
return;
}
if (ch1[]=='p' && ch2[]=='v')
{
stack <int> q;
while (temp!=a)
{
q.push(temp);
arr[rec[a]].pop();
temp=arr[rec[a]].top();
}
arr[rec[b]].push(temp);
arr[rec[a]].pop();
rec[a]=rec[b];
while (!q.empty())
{
int tt=q.top();
q.pop();
rec[tt]=rec[b];
arr[rec[b]].push(tt);
}
}
}
void print()
{
for (int i=;i<n;i++)
{
printf("%d:",i);
stack<int> q;
while (!arr[i].empty())
{
int temp=arr[i].top();
q.push(temp);
arr[i].pop();
} while (!q.empty())
{
printf(" %d",q.top());
q.pop();
} putchar('\n');
}
}
int main()
{
scanf("%d",&n);
int i,j;
for (i=;i<n;i++){
arr[i].push(i);
rec[i]=i;
}
getchar();
while (scanf("%s",ch1))
{
if (ch1[]=='q')
break;
scanf("%d%s%d",&a,ch2,&b);
getchar();
solve();
}
print();
}

UVA-101 The Blocks Problem 栈模拟的更多相关文章

  1. UVa 101 The Blocks Problem Vector基本操作

    UVa 101 The Blocks Problem 一道纯模拟题 The Problem The problem is to parse a series of commands that inst ...

  2. UVa 101 - The Blocks Problem(积木问题,指令操作)

    题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...

  3. UVa 101 The Blocks Problem

    题意:给出从左到右放置的n块木块(从0开始编号),再给出四种操作,再给出相应的操作,输出操作结束后每一堆木块的情况. 学习的紫书,因为每一堆的木块数是在发生变化的,所以用vector. 然后就是模拟几 ...

  4. UVa 101 - The Blocks Problem STL

    题目:给你n个方块,有四种操作: .move a onto b,把a和b上面的方块都放回原来位置,然后把a放到b上面: .move a over b,把a上面的放回原处,然后把a放在b所在的方块堆的上 ...

  5. Uva 101 -- the block problem

    Uva 101 the block problem 题目大意: 输入n,得到编号为0~n-1的木块,分别摆放在顺序排列编号为0~n-1的位置.现对这些木块进行操作,操作分为四种. 1.move a o ...

  6. ACM学习历程——UVA 127 "Accordian" Patience(栈;模拟)

    Description  ``Accordian'' Patience  You are to simulate the playing of games of ``Accordian'' patie ...

  7. uvaoj 101 - The Blocks Problem(vector应用+技巧)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=835&page= ...

  8. 【UVA - 101】The Blocks Problem(vector+模拟)

    The Blocks Problem Descriptions:(英语就不说了,直接上翻译吧) 初始时从左到右有n个木块,编号为0~n-1,要求实现下列四种操作: move a onto b: 把a和 ...

  9. 木块问题(The Blocks Problem,Uva 101)

    不定长数组:vector vector就是一个不定长数组.不仅如此,它把一些常用操作“封装”在了vector类型内部. 例如,若a是一个vector,可以用a.size( )读取它的大小,a.resi ...

随机推荐

  1. 面试-PA和XSYX面试小结

    XSYX 1.自我介绍 2. 最近一个项目的业务和技术栈 3. 分布式锁解决库存问题 4. spring的IOC和AOP讲解 5. 类加载器层级 6.线程池核心参数和问题 7. 期待的团队是怎样的? ...

  2. 学会C#

    一.字符串插值 (String Interpolation) C# 6之前我们拼接字符串时需要这样 var Name = "Jack"; var results = "H ...

  3. python二维图像输出操作大全(非常全)!

    //2019.07.141.matplotlib模块输出函数图像应用时主要用的是它的ptplot模块,因此在导入使用该模块时可以直接用以下语句:import matplotlib.pyplot as ...

  4. poj 1027 Ignatius and the Princess II全排列

    Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ( ...

  5. 2020/2/22 74cms3.5.1 代码审计

    0x00 网站结构 简单试了一下.每一个模块还是比较清楚的,分别对应网站的一个模块.还有一些没有权限访问 0x01 通读代码 先看入口文件,index.php 开头先对网站是否安装做了判断 然后就是判 ...

  6. Spring入门之四-------SpringIoC之其他知识点

    一.懒加载 public class Bean1 { public Bean1() { System.out.println(this.getClass().getSimpleName() + &qu ...

  7. GNS3 模拟Arp命令2

    R1 : conf t int f0/0 no shutdown ip add 192.168.1.1 255.255.255.0 no ip routing end R2 f0/0: conf t ...

  8. 19 03 13 关于 scrapy 框架的 对环球网的整体爬取(存储于 mongodb 数据库里)

    关于  spinder  在这个框架里面   和不用数据库  相同 # -*- coding: utf-8 -*- import scrapy from yang_guan.items import ...

  9. Bean 注解(Annotation)配置(2)- Bean作用域与生命周期回调方法配置

    Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...

  10. junit基础学习之-测试service层(3)

    测试步骤: 在之前的文章中已经加了junit的环境,这就不需要了. 1.加载junit类,spring配置文件,指明junit测试器,@Runwith 2.定义变量,service,不可以使用spri ...