1. 程式人生 > 其它 >【模擬】POJ - 1208 The Blocks Problem

【模擬】POJ - 1208 The Blocks Problem

技術標籤:# 題解萌

The Blocks Problem

解題思路

vector 模擬即可。

參考程式碼

#include<stdio.h>
#include<iostream>
#include<vector>
#include<cstring>
#include<cstdio>
#include<climits>
#include<cmath>
#include<algorithm>
#include<queue>
#include<deque>
#include
<map>
#include<set> #include<stack> #define LL long long #define LOCAL const int maxn = 30; const int N = 100; using namespace std; int readint() { int x; scanf("%d", &x); return x; } vector<int> v[maxn]; void get_ph(int x, int &pile, int &h) { for
(int i = 0; i < maxn; i++) { for(int j = 0; j < v[i].size(); j++) { if (v[i][j] == x) { pile = i, h = j; break; } } } } void clear_above(int pile, int h) { for(int i = h + 1; i < v[pile].size(); i++) { int
now = v[pile][i]; v[now].push_back(now); } v[pile].resize(h + 1); } void move_onto(int a, int b) { int pa, pb, ha, hb; get_ph(a, pa, ha); get_ph(b, pb, hb); if (pa != pb) { clear_above(pa, ha); clear_above(pb, hb); v[pa].resize(ha); v[pb].push_back(a); } } void move_over(int a, int b) { int pa, pb, ha, hb; get_ph(a, pa, ha); get_ph(b, pb, hb); if (pa != pb) { clear_above(pa, ha); v[pb].push_back(a); v[pa].resize(ha); } } void pile_onto(int a, int b) { int pa, pb, ha, hb; get_ph(a, pa, ha); get_ph(b, pb, hb); if (pa != pb) { clear_above(pb, hb); for(int i = ha; i < v[pa].size(); i++) { v[pb].push_back(v[pa][i]); } v[pa].resize(ha); } } void pile_over(int a, int b) { int pa, pb, ha, hb; get_ph(a, pa, ha); get_ph(b, pb, hb); if (pa != pb) { for(int i = ha; i < v[pa].size(); i++) { v[pb].push_back(v[pa][i]); } v[pa].resize(ha); } } int n; void init() { for(int i = 0; i < n; i++) v[i].push_back(i); } int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); // freopen("output.txt", "w", stdout); #endif n = readint(); getchar(); char s[N]; init(); while (gets(s)) { if (s[0] == 'q') break; char op1[10], op2[10]; int a, b; sscanf(s, "%s %d %s %d", op1, &a, op2, &b); if (op1[0] == 'm') { if (op2[1] == 'n') move_onto(a, b); else move_over(a, b); } else { if (op2[1] == 'n') pile_onto(a, b); else pile_over(a, b); } } for(int i = 0; i < n; i++) { printf("%d:", i); if (!v[i].empty()) { for(int j = 0; j < v[i].size(); j++) { printf(" %d", v[i][j]); } } printf("\n"); } return 0; }