挺水的模拟题,刚开始题目看错了,poj竟然过了。。。无奈。uva果断wa了
搞清题目意思后改了一下,过了uva。
题目要求模拟木块移动:
有n(0<n<25)快block,有5种操作:
move a onto b 在将a搬到b上之前,先把a和b上的积木放回原來的位置
move a over b在将a搬到b所在的那堆积木上前,先把a上的积木放回原來的位罝
pile a onto b 将包括a本身和上方的积木一起放到b上,在放之前b上方的积木放回原来的位置
pile a over b 将包括a本身和上放的积木一起搬到到b所在的那堆上
quit结束命令,前四个动作中若ab在同一堆中,则不做改变。
我用的vector模拟,其实用线性表也不错的,纯当练习stl了。
代码:
#include <iostream> #include <string> #include <vector> using namespace std; typedef vector<int>::iterator VI; vector <int> v[30]; int rec[30]; int n; VI Find(vector <int> &v, int num) { for (VI i = v.begin(); i != v.end(); i++) if (*i == num) { return i; } return v.begin() - 1; }//find num in vector v void check() { /* for (int i = 0; i < n; i++) cout << rec[i] << ' '; cout << endl; */ for (int i = 0; i < n; i++) { cout << i << ':'; if (v[i].empty()) { cout << endl; continue; } cout << ' ' << v[i][0]; for (int j = 1; j < v[i].size(); j++) cout << ' ' << v[i][j]; cout << endl; } } int main() { cin >> n; for (int i = 0; i < n; i++) { v[i].clear(); v[i].push_back(i); rec[i] = i; }//for init string ts; int tn1, tn2; while (cin >> ts && ts != "quit") { if (ts == "move") { cin >> tn1 >> ts >> tn2; if (rec[tn1] == rec[tn2]) continue; while (v[rec[tn1]].back() != tn1) { rec[v[rec[tn1]].back()] = v[rec[tn1]].back(); v[v[rec[tn1]].back()].push_back(v[rec[tn1]].back()); v[rec[tn1]].pop_back(); } v[rec[tn1]].pop_back(); if (ts == "onto") { VI i; while (v[rec[tn2]].back() != tn2) { rec[v[rec[tn2]].back()] = v[rec[tn2]].back(); v[v[rec[tn2]].back()].push_back(v[rec[tn2]].back()); v[rec[tn2]].pop_back(); } v[rec[tn2]].push_back(tn1); rec[tn1] = rec[tn2]; }//move onto else { v[rec[tn2]].push_back(tn1); rec[tn1] = rec[tn2]; }//move over } else { cin >> tn1 >> ts >> tn2; if (rec[tn1] == rec[tn2]) continue; if (ts == "onto") { while (v[rec[tn2]].back() != tn2) { rec[v[rec[tn2]].back()] = v[rec[tn2]].back(); v[v[rec[tn2]].back()].push_back(v[rec[tn2]].back()); v[rec[tn2]].pop_back(); } VI pos1 = Find(v[rec[tn1]], tn1), pos2 = Find(v[rec[tn2]], tn2); int tmp[25], cnt = 0; for (VI i = v[rec[tn1]].end() - 1; i >= pos1; i--) { // cout << "*i=" << *i << endl; tmp[cnt++] = *i; v[rec[tn1]].erase(i); rec[*i] = rec[tn2]; } for (int i = 0; i < cnt / 2; i++) { int t = tmp[i]; tmp[i] = tmp[cnt - i - 1]; tmp[cnt - i - 1] = t; } v[rec[tn2]].insert(pos2 + 1, tmp, tmp + cnt); }//pile onto else { VI pos1 = Find(v[rec[tn1]], tn1); int tmp[25], cnt = 0; for (VI i = v[rec[tn1]].end() - 1; i >= pos1; i--) { // cout << "*i=" << *i << endl; tmp[cnt++] = *i; v[rec[tn1]].erase(i); rec[*i] = rec[tn2]; } for (int i = 0; i < cnt / 2; i++) { int t = tmp[i]; tmp[i] = tmp[cnt - i - 1]; tmp[cnt - i - 1] = t; } v[rec[tn2]].insert(v[rec[tn2]].end(), tmp, tmp + cnt); }//pile over } }//while check(); return 0; }