uva 101
来源:互联网 发布:软件质量保证书范本 编辑:程序博客网 时间:2024/05/23 00:03
题目:给你n个方块,有四种操作:
1.move a onto b,把a和b上面的方块都放回原来位置,然后把a放到b上面;
2.move a over b,把a上面的放回原处,然后把a放在b所在的方块堆的上面;
3.pile a onto b,把b上面的放回原来位置,然后把a和a上面的方块整体放到b上面;
4.pile a over b,把a和a上面的方块整体放到b所在堆的上面。
分析:模拟,数据结构。观察操作,如果是move就是先把a上面的还原,如果是onto就是先把b上面的还原。
然后,就是移动一堆到另一堆的上面(单个也认为是一堆)。所以设置两个基础操作:
1.将a上面的还原init_pos(a);
2.将a和上面的(可以没有上面的)放到b上面pile_over(a, b)。
那么上述的四组操作就变成下面了:
1.move a onto b,init_pos(a);init_pos(b);pile_over(a, b);
2.move a over b,init_pos(a);pile_over(a, b);
3.pile a onto b,init_pos(b);pile_over(a, b);
4.pile a over b,pile_over(a, b)。
利用两个操作轻松解决。具体实现时设置一个place数组记录每个编号的方块对应的堆。
摘抄出处:http://blog.csdn.net/mobius_strip/article/details/12765319
再次,膜拜大神;(将模拟问题拆分为最基础的几个子问题,封装成为函数,减少代码量,同时思路更加清晰);
#include <iostream>#include <stack>#include <cstdio>using namespace std;stack<int> s[25];int place[25]; //存放位置;stack<int> s_t; //临时用来转换的堆;void init_pos(int a){ int p = place[a]; while(!s[p].empty()){ int v = s[p].top(); if(v == a) break; s[v].push(v); place[v] = v; s[p].pop(); }}void pile_over(int a, int b){ int p_a = place[a]; int p_b = place[b]; while(!s[p_a].empty()){ int v = s[p_a].top(); if(v == a) break; s_t.push(v); s[p_a].pop(); } s_t.push(a); s[p_a].pop(); while(!s_t.empty()){ int v = s_t.top(); s[p_b].push(v); place[v] = p_b; s_t.pop(); }}int main(){ int n; char oper[5], type[5]; int a, b; while(cin >> n){ for(int i = 0; i < n; ++i){ s[i].push(i); place[i] = i; } while(scanf("%s", oper)){ if(oper[0] == 'q') break; scanf("%d%s%d", &a, type, &b); if(place[a] == place[b]) //b在a之上,不处理; continue; if(oper[0] == 'm') // 如果是move,将a之上的所有元素放回初始位置; init_pos(a); if(type[1] == 'n') // 如果是onto,将b之上的所有元素放回初始位置; init_pos(b); pile_over(a, b); } int s_k[25]; for(int i = 0; i < n; ++i){ cout << i << ':'; int cnt = 0; while(!s[i].empty()){ s_k[cnt++] = s[i].top(); s[i].pop(); } for(int j = cnt-1; j >= 0; --j){ cout << ' ' << s_k[j]; } cout << endl; } }}
- uva 101
- UVA 101
- UVA 101
- uva 101
- uva 101
- uva 101
- uva 101
- uva-101
- uva 101
- UVa 101
- UVa 101
- uva 101
- uva 101
- uva 101
- UVA 101
- uva 101
- uva 101
- UVA - 101
- CodeForces 560A Currency System in Geraldion
- C语言编程入门——综合练习(二)
- 指针之 *((volatile unsigned long *)(x))解析
- poj-2553 Frogger
- 2015 多校联赛 ——HDU5344(水)
- uva 101
- Android开发--Intent-filter属性详解
- 第一天 ted英语学习Chris Milk: How virtual reality can create the ultimate empathy machine
- Java中的多线程
- Direct-X学习笔记--天空盒
- HDU5137
- 《Windows Internals》第六版 Chapter 6 Security 笔记
- UISlider 和 UISegement
- 博客我来了