uva101The Blocks Problem

发布时间 2023-12-05 10:35:44作者: 黑屿白

原题链接The Blocks Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

一道模拟题。(水题) 但模拟过程很有意思,怎么样才能用最短的代码完成所有操作,使代码更简洁是很考验技术的。

 

#include<bits/stdc++.h>
using namespace std;
vector<int> block[30]; 
vector<int> m;
void find_block(int x,int c[]) {
    while (block[c[x]].back()!=x) {
        int y=block[c[x]].back();
        block[c[x]].pop_back();
        c[y]=y;
        block[c[y]].push_back(y);
    }
}
void move_onto(int a,int b,int c[]) {
    find_block(a,c);
    find_block(b,c);
    block[c[a]].pop_back();
    block[c[b]].push_back(a);
    c[a]=c[b];
}
void move_over(int a,int b,int c[]) {
    find_block(a,c);
    block[c[a]].pop_back();
    block[c[b]].push_back(a);
    c[a]=c[b];
}
void pile_over(int a,int b,int c[]) {
    while (block[c[a]].back()!=a) {
        int y=block[c[a]].back();
        block[c[a]].pop_back();
        m.push_back(y);
    }
    m.push_back(block[c[a]].back());
    block[c[a]].pop_back();
    while (!m.empty()) {
        int y=m.back();
        m.pop_back();
        c[y]=c[b];
        block[c[b]].push_back(y);
    }
}
int main() {
    int n;
    cin>>n;
    int c[n+10];
    for (int i=0; i<n; i++) {
        block[i].push_back(i);
        c[i]=i;
    }
    string s,s1;
    int a,b;
    do {
        cin>>s;
        if (s!="quit") {
            cin>>a>>s1>>b;
            if (c[a]==c[b]) continue;
            if (s=="move" && s1=="onto") move_onto(a,b,c);
            if (s=="move" && s1=="over") move_over(a,b,c);
            if (s=="pile" && s1=="onto") {
                find_block(b,c);
                pile_over(a,b,c);
            }
            if (s=="pile" && s1=="over") pile_over(a,b,c);
        }
    } while (s!="quit");
    for (int i=0; i<n; i++) {
        printf("%d:",i);
        for (int j=0; j<block[i].size(); j++) printf(" %d",block[i][j]);
        printf("\n");
    }
    return 0;
}

Ps:使用函数vector中的resize()可以使代码更简洁。