zoukankan      html  css  js  c++  java
  • UVA 101 The Blocks Problem

    题目链接:https://vjudge.net/problem/UVA-101

    题目大意

      初始时从左到右有n个木块,编号为0~n-1,要求实现下列四种操作:

    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所在木块堆的最上方

      一组数据的结束标志为"quit",如果有非法指令(a和b在同一堆),应当忽略。

      输出:所有操作输入完毕后,从左到右,从下到上输出每个位置的木块编号。

      翻译搬运自洛谷。

    分析

      一道简单的模拟题,没什么技术含量,纯Coding。

    代码如下

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3  
      4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
      5 #define Rep(i,n) for (int i = 0; i < (n); ++i)
      6 #define For(i,s,t) for (int i = (s); i <= (t); ++i)
      7 #define rFor(i,t,s) for (int i = (t); i >= (s); --i)
      8 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i)
      9 #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i)
     10 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
     11 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i)
     12  
     13 #define pr(x) cout << #x << " = " << x << "  "
     14 #define prln(x) cout << #x << " = " << x << endl
     15  
     16 #define LOWBIT(x) ((x)&(-x))
     17  
     18 #define ALL(x) x.begin(),x.end()
     19 #define INS(x) inserter(x,x.begin())
     20  
     21 #define ms0(a) memset(a,0,sizeof(a))
     22 #define msI(a) memset(a,inf,sizeof(a))
     23 #define msM(a) memset(a,-1,sizeof(a))
     24 
     25 #define MP make_pair
     26 #define PB push_back
     27 #define ft first
     28 #define sd second
     29  
     30 template<typename T1, typename T2>
     31 istream &operator>>(istream &in, pair<T1, T2> &p) {
     32     in >> p.first >> p.second;
     33     return in;
     34 }
     35  
     36 template<typename T>
     37 istream &operator>>(istream &in, vector<T> &v) {
     38     for (auto &x: v)
     39         in >> x;
     40     return in;
     41 }
     42  
     43 template<typename T1, typename T2>
     44 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) {
     45     out << "[" << p.first << ", " << p.second << "]" << "
    ";
     46     return out;
     47 }
     48 
     49 inline int gc(){
     50     static const int BUF = 1e7;
     51     static char buf[BUF], *bg = buf + BUF, *ed = bg;
     52     
     53     if(bg == ed) fread(bg = buf, 1, BUF, stdin);
     54     return *bg++;
     55 } 
     56 
     57 inline int ri(){
     58     int x = 0, f = 1, c = gc();
     59     for(; c<48||c>57; f = c=='-'?-1:f, c=gc());
     60     for(; c>47&&c<58; x = x*10 + c - 48, c=gc());
     61     return x*f;
     62 }
     63  
     64 typedef long long LL;
     65 typedef unsigned long long uLL;
     66 typedef pair< double, double > PDD;
     67 typedef pair< int, int > PII;
     68 typedef pair< string, int > PSI;
     69 typedef set< int > SI;
     70 typedef vector< int > VI;
     71 typedef vector< VI > VVI;
     72 typedef vector< PII > VPII;
     73 typedef map< int, int > MII;
     74 typedef multimap< int, int > MMII;
     75 typedef unordered_map< int, int > uMII;
     76 typedef pair< LL, LL > PLL;
     77 typedef vector< LL > VL;
     78 typedef vector< VL > VVL;
     79 typedef priority_queue< int > PQIMax;
     80 typedef priority_queue< int, VI, greater< int > > PQIMin;
     81 const double EPS = 1e-10;
     82 const LL inf = 0x7fffffff;
     83 const LL infLL = 0x7fffffffffffffffLL;
     84 const LL mod = 1e9 + 7;
     85 const int maxN = 1e5 + 7;
     86 const LL ONE = 1;
     87 const LL evenBits = 0xaaaaaaaaaaaaaaaa;
     88 const LL oddBits = 0x5555555555555555;
     89 
     90 int n;
     91 VVI block; 
     92 MII pos;
     93 
     94 // 把 a 号块上面的所有方块复位 
     95 void reSet(int a) {
     96     int x;
     97     while((x = block[pos[a]].back()) != a) {
     98         block[pos[a]].pop_back();
     99         block[x].PB(x);
    100         pos[x] = x;
    101     }
    102 }
    103 
    104 // pile a over b
    105 void D(int a, int b) {
    106     stack< int > sk;
    107     int x;
    108     do {
    109         x = block[pos[a]].back();
    110         block[pos[a]].pop_back();
    111         sk.push(x);
    112         pos[x] = pos[b];
    113     }while(x != a);
    114     
    115     while(!sk.empty()) {
    116         block[pos[b]].PB(sk.top());
    117         sk.pop();
    118     }
    119 }
    120 
    121 // move a onto b
    122 void A(int a, int b) {
    123     reSet(a);
    124     reSet(b);
    125     D(a, b);
    126 }
    127 
    128 // move a over b
    129 void B(int a, int b) {
    130     reSet(a);
    131     D(a, b);
    132 }
    133 
    134 // pile a onto b
    135 void C(int a, int b) {
    136     reSet(b);
    137     D(a, b);
    138 }
    139 
    140 void (*func[4])(int, int) = {A, B, C, D};
    141 
    142 int main(){
    143     INIT();
    144     cin >> n;
    145     block.assign(n, VI());
    146     Rep(i, n) {
    147         block[i].PB(i);
    148         pos[i] = i;
    149     }
    150     
    151     string tmp;
    152     int x, y, mode;
    153     while(cin >> tmp) {
    154         mode = 0;
    155         if(tmp[0] == 'q') break;
    156         if(tmp[0] == 'p') mode |= 2;
    157         cin >> x >> tmp >> y;
    158         if(tmp[1] == 'v') mode |= 1;
    159         if(pos[x] == pos[y]) continue;
    160         func[mode](x, y);
    161     }
    162     
    163     Rep(i, n) {
    164         cout << i << ":";
    165         foreach(j, block[i]) cout << " " << *j;
    166         cout << endl;
    167     }
    168     return 0;
    169 }
    View Code
  • 相关阅读:
    Android游戏开发22:Android动画的实现J2me游戏类库用于Android开发
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第三部分,完整代码)
    使用OGR创建dxf格式矢量数据
    mysql 数据库引擎 MyISAM InnoDB 大比拼 区别
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第二部分)
    mysql 更改数据库引擎
    android sqlite SQLiteDatabase 操作大全 不看后悔!必收藏!看后精通SQLITE (第一部分)
    android 数字键盘使用
    MySQL Innodb数据库性能实践
    eclipse : Error while performing database login with the driver null
  • 原文地址:https://www.cnblogs.com/zaq19970105/p/10961143.html
Copyright © 2011-2022 走看看