[uva] 101 - The Blocks Problem
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=37
纯模拟, 要先考虑好用什么数据结构能方便的支持模拟中的各种操作, 我选择的是链表, 于是直接用的STL的List, STL真是很实用, 点赞.
1 #include <cstdio> 2 #include <list> 3 #include <vector> 4 #include <map> 5 #include <string> 6 #include <cstring> 7 #include <algorithm> 8 using namespace std; 9 10 #define MAX_LEN 255 11 int n = 0; 12 vector<list<int> > vec; 13 map<int, int> ma; 14 15 void resetListByBlockNum(int blockNum) { 16 list<int>& l = vec[ma[blockNum]]; 17 list<int>::iterator itStart = find(l.begin(), l.end(), blockNum); 18 if (itStart == l.end()) { 19 return; 20 } 21 itStart++; 22 list<int>::iterator it = itStart; 23 for (; it != l.end();) { 24 ma[*it] = *it; 25 vec[*it].push_back(*it); 26 it = l.erase(it); 27 } 28 } 29 30 void moveSubListByBlockNum(int a, int b) { 31 list<int>& la = vec[ma[a]]; 32 list<int>& lb = vec[ma[b]]; 33 list<int>::iterator itaStart = find(la.begin(), la.end(), a); 34 list<int>::iterator ita = itaStart; 35 for (; ita != la.end();) { 36 ma[*ita] = ma[b]; 37 lb.push_back(*ita); 38 ita = la.erase(ita); 39 } 40 } 41 42 void processCmd(string m1, string m2, int a, int b) { 43 list<int>& la = vec[ma[a]]; 44 list<int>& lb = vec[ma[b]]; 45 if (a == b || ma[a] == ma[b] || la.empty()) { 46 return; 47 } 48 if (m1 == "move" && m2 == "onto") { 49 resetListByBlockNum(a); 50 la.pop_back(); 51 resetListByBlockNum(b); 52 lb.push_back(a); 53 ma[a] = ma[b]; 54 } else if (m1 == "move" && m2 == "over") { 55 resetListByBlockNum(a); 56 la.pop_back(); 57 lb.push_back(a); 58 ma[a] = ma[b]; 59 } else if (m1 == "pile" && m2 == "onto") { 60 resetListByBlockNum(b); 61 moveSubListByBlockNum(a, b); 62 } else if (m1 == "pile" && m2 == "over") { 63 moveSubListByBlockNum(a, b); 64 } else { 65 printf("CMD_ERROR\n"); 66 return; 67 } 68 } 69 70 void printResult() { 71 for (unsigned int i = 0; i < n; ++i) { 72 printf("%d:", i); 73 list<int>& l = vec[i]; 74 list<int>::iterator it; 75 for (it = l.begin(); it != l.end(); ++it) { 76 printf(" %d", *it); 77 } 78 printf("\n"); 79 } 80 } 81 82 int main(int argc, const char * argv[]) 83 { 84 scanf("%d", &n); 85 vec.clear(); 86 for (int i = 0; i < n; ++i) { 87 list<int> l(1,i); 88 vec.push_back(l); 89 ma[i] = i; 90 } 91 while (true) { 92 char m1[MAX_LEN] = {0}; 93 char m2[MAX_LEN] = {0}; 94 int a = 0, b = 0; 95 scanf("%s", m1); 96 if (strcmp(m1, "quit") == 0) { 97 break; 98 } 99 scanf(" %d %s %d", &a, m2, &b); 100 processCmd(m1, m2, a, b); 101 } 102 printResult(); 103 return 0; 104 }