UVA101 The Blocks Problem
Posted rysort
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVA101 The Blocks Problem相关的知识,希望对你有一定的参考价值。
链接:https://vjudge.net/problem/UVA-101
模拟四种操作,对这四种操作分析总结,找出差异,需要执行三种操作:找关键木块、把关键木块上的木块移回原位、把另一个关键木块或者包括它上面的木块移回原位。
数据结构的核心是vector<int>pile[maxn],所有操作都是围绕它进行的。vector就像一个二维数组,只是第一维的大小是固定的(不超过maxn),但第二维的大小不固定。上述代码还有一个值得学习的技巧:输入一共4种指令,但如果完全独立地处理各指令,代码就会变得冗长而且易错。更好的方法是提取指令之间的共同点,编写函数以减少重复代码。
注意:vector头文件中的vector是一个不定长数组,可以用clear()清空,resize()改变大小,用push_back()和pop_back()在尾部添加和删除元素,用empty()测试是否为空。vector之间可以直接赋值或者作为函数的返回值。
#include <iostream> #include <cstdio> #include <string> #include <vector> #include <algorithm> using namespace std; const int maxn=30; vector<int> pile[maxn]; int n; void find_block(int a,int& p,int& h) { for(p=0;p<n;p++) { for(h=0;h<pile[p].size();h++) { if(pile[p][h]==a) return ; } } } void clear_block(int p,int h) { for(int i=h+1;i<pile[p].size();i++) { int b=pile[p][i]; pile[b].push_back(b); } pile[p].resize(h+1); } void pile_block(int p,int h,int p2) { for(int i=h;i<pile[p].size();i++) { pile[p2].push_back(pile[p][i]); } pile[p].resize(h); } void print() { for(int i=0;i<n;i++) { printf("%d:",i); for(int j=0;j<pile[i].size();j++) { printf(" %d",pile[i][j]); } printf(" "); } } int main() { string s1,s2; int a,b,pa,ha,pb,hb; cin>>n; for(int i=0;i<n;i++) pile[i].push_back(i); while(cin>>s1) { if(s1=="quit") break; cin>>a>>s2>>b; find_block(a,pa,ha); find_block(b,pb,hb); if(pa==pb) continue; if(s1=="move") clear_block(pa,ha); if(s2=="onto") clear_block(pb,hb); pile_block(pa,ha,pb); } print(); return 0; }
以上是关于UVA101 The Blocks Problem的主要内容,如果未能解决你的问题,请参考以下文章
UVa 101 - The Blocks Problem STL
E - The Blocks Problem ( UVA - 101)
木块问题 The Blocks Problem, UVa 101