标签:
Time Limit: 1000 MS Memory Limit: 10000 KB
64-bit integer IO format: %I64d , %I64u Java class name: Main
10 move 9 onto 1 move 8 over 1 move 7 over 1 move 6 over 1 pile 8 over 6 pile 8 over 5 move 2 over 1 move 4 over 9 quit
0: 0 1: 1 9 2 4 2: 3: 3 4: 5: 5 8 7 6 6: 7: 8: 9:
1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <string> 5 using namespace std; 6 int n; 7 vector<int>pile[30]; 8 //找到木块所在的堆pile和高度height,以引用的形式返回调用者 9 void find_block(int a, int& p,int& h){ //引用是传递地址...当在函数里修改其值,变量的值也会随着改变 10 for(p=0;p<n;p++) 11 for(h=0;h<pile[p].size();h++) 12 if(pile[p][h]==a) return ;//void中的return:退出函数体,如果在函数体结尾处不加也可自动退出, 13 //如果在中途需要退出的话就用return 14 } 15 //把p堆高度为h的木块上方所有的木块移回原位置 16 void clear_above(int p,int h){ 17 for(int i=h+1;i<pile[p].size();i++){ 18 int t=pile[p][i]; 19 pile[t].push_back(t); //把标号为t的木块放回原位,即t堆 20 } 21 pile[p].resize(h+1); //重新定义p堆的长度 22 } 23 //把p堆高度为h及其上方的木块整体移到p2堆得尾部 24 void pile_onto(int p,int h,int p2){ 25 for(int i=h;i<pile[p].size();i++) pile[p2].push_back(pile[p][i]); 26 pile[p].resize(h); 27 } 28 //输出木块最后的状态 29 void print(){ 30 for(int i=0;i<n;i++){ 31 printf("%d:",i); 32 for(int j=0;j<pile[i].size();j++){ 33 printf(" %d",pile[i][j]); 34 } 35 printf("\n"); 36 } 37 } 38 int main(){ 39 int a,b; 40 string s1,s2; 41 scanf("%d",&n); 42 for(int i=0;i<n;i++) pile[i].push_back(i); 43 while(cin>>s1){ 44 if(s1=="quit") break; 45 cin>>a>>s2>>b; 46 int pa,pb,ha,hb; 47 find_block(a,pa,ha); 48 find_block(b,pb,hb); 49 if(pa==pb) continue; 50 if(s2=="onto") clear_above(pb,hb); 51 if(s1=="move") clear_above(pa,ha); 52 pile_onto(pa,ha,pb); 53 } 54 print(); 55 return 0; 56 }
题后总结:
数据结构的核心是vector<int>pile[maxn],所有操作都是围绕它进行的。vector就像一个二维数组,只是第一维大小固定(最大maxn),二维大小不固定。上述代码还有一个值得学习的技巧就是:输入一共有4种指令,提取指令之间的共同点,编写函数以减少重复代码。
标签:
原文地址:http://www.cnblogs.com/yangxingzhe8102/p/5933662.html