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
  • 相关阅读:
    最终版需求分析
    第九次会议
    第八次会议
    软工测试文档
    软工第七次会议记录
    第六次会议
    软件工程第二次和第三次会议
    Java环境搭建与概述
    [JavaWeb] Ajax&JQuery
    [JavaWeb] JSP
  • 原文地址:https://www.cnblogs.com/zaq19970105/p/10961143.html
Copyright © 2011-2022 走看看