uvaoj 101 - The Blocks Problem(vector应用+技巧)
Posted fqfzs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了uvaoj 101 - The Blocks Problem(vector应用+技巧)相关的知识,希望对你有一定的参考价值。
木块问题,模拟堆的操作。每个堆的高度不确定,用vector来做很合适(vector动态)。
本题模拟四个操作:
1.move a onto b:把a和b上方的木块全部放回原来的堆,然后把a摞在b上面
2.move a over b:把a上方的木块全部放回原来的堆,然后把a放在b所在木块堆的顶部
3.pile a onto b:把b上方的木块全部放回原来的堆,然后把a及上面的木块整体摞在b上面。
4.pile a over b:把a及上面的木块整体摞在b所在木块堆的顶部。
这里有一个技巧:四种指令完全独立处理会使代码变得复杂,容易出错。所以可以提取出他们之间的共同点,以减少重复代码。
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int maxn=30; 4 int n; 5 vector<int> pile[maxn];//每个pile[i]是一个vector 6 //找木块a所在的pile和height,以引用的形式返回调用者 7 void find_block(int a,int& p,int& h) 8 { 9 for(p=0;p<n;p++) 10 { 11 for(h=0;h<pile[p].size();h++) 12 { 13 if(pile[p][h]==a)return; 14 } 15 } 16 } 17 //第P堆高度为h的木块上方的所有木块移回原位 18 void clear_above(int p,int h) 19 { 20 for(int i=h+1;i<pile[p].size();i++) 21 { 22 int b=pile[p][i]; 23 pile[b].push_back(b); 24 } 25 pile[p].resize(h+1);//第p堆只保留下标在0~h之间的元素 26 } 27 //把第p堆高度为h及其上方的木块整体移动到p2堆 28 void pile_onto(int p,int h,int p2) 29 { 30 for(int i=h;i<pile[p].size();i++) 31 { 32 pile[p2].push_back(pile[p][i]); 33 } 34 pile[p].resize(h);//第p堆只保留下标在0~h-1之间的元素 35 } 36 //打印函数 37 void print() 38 { 39 for(int i=0;i<n;i++) 40 { 41 printf("%d:",i); 42 for(int j=0;j<pile[i].size();j++)printf(" %d",pile[i][j]); 43 printf(" "); 44 } 45 } 46 int main() 47 { 48 int a,b; 49 cin>>n; 50 string s1,s2; 51 for(int i=0;i<n;i++)pile[i].push_back(i);//初始化,给木块赋上相应对的编号 52 while(cin>>s1) 53 { 54 if(s1!="quit")cin>>a>>s2>>b; 55 else break; 56 int pa,pb,ha,hb; 57 find_block(a,pa,ha); 58 find_block(b,pb,hb); 59 if(pa==pb)continue; 60 if(s2=="onto")clear_above(pb,hb); 61 if(s1=="move")clear_above(pa,ha); 62 pile_onto(pa,ha,pb); 63 } 64 print(); 65 return 0; 66 }
以上是关于uvaoj 101 - The Blocks Problem(vector应用+技巧)的主要内容,如果未能解决你的问题,请参考以下文章
UVa 101 - The Blocks Problem STL
E - The Blocks Problem ( UVA - 101)