原题链接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()可以使代码更简洁。
标签:Blocks,int,over,move,back,pop,uva101The,Problem,block From: https://www.cnblogs.com/purple123/p/17876667.html