题目:给你n个方块,有四种操作: 1.move a onto b,把a和b上面的方块都放回原来位置,然后把a放到b上面; 2.move a over b,把a上面的放回原处,然后把a放在b所在的方块堆的上面; 3.pile a onto b,把b上面的放回原来位置,然后把a和a上面的方块整体放到b上面; 4.pile a over b,把a和a上面的方块整体放到b所在堆的上面。 分析:模拟,数据结构。观察操作,如果是move就是先把a上面的还原,如果是onto就是先把b上面的还原。 然后,就是移动一堆到另一堆的上面(单个也认为是一堆)。所以设置两个基础操作: 1.将a上面的还原init_place(a); 2.将a和上面的(可以没有上面的)放到b上面pile_a_to_b(a,b)。 那么上述的四组操作就变成下面了: 1.move a onto b,init_place(a);init_place(b);pile_a_to_b(a,b); 2.move a over b,init_place(a);pile_a_to_b(a,b); 3.pile a onto b,init_place(b);pile_a_to_b(a,b); 4.pile a over b,pile_a_to_b(a,b)。 利用两个操作轻松解决。具体实现时设置一个place数组记录每个编号的方块对应的堆。 注意:如果a和b已经在一堆中就不要操作,此时认为不用移动,否则会WA。
~~~~~~~~~~~~~抄对了.~~~~~~~然而并不懂 .
1 #include<cstdio> 2 #include<string> 3 #include<vector> //该头文件中的 vector 是一个不定长的数组 4 #include<iostream> 5 using namespace std; 6 const int maxn=30; 7 int n; 8 vector<int>pile[maxn]; 9 void find_block(int a,int& p,int& h) 10 { 11 for(p=0;p<n;p++) 12 { 13 for(h=0;h<pile[p].size();h++) //从0 开始 遍历 看其是否 有等0之时 . 14 if(pile[p][h]==a) 15 return; 16 } 17 } 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); 26 } 27 void pile_onto(int p,int h,int p2) 28 { 29 for(int i=h;i<pile[p].size();i++) 30 pile[p2].push_back(pile[p][i]); 31 pile[p].resize(h); 32 } 33 void print() 34 { 35 for(int i=0;i<n;i++) 36 { 37 printf("%d:",i); 38 for(int j=0;j<pile[i].size();j++) 39 printf(" %d",pile[i][j]); 40 printf(" "); 41 } 42 } 43 int main() 44 { 45 int a,b; 46 scanf("%d",&n); 47 string s1,s2; 48 for(int i=0;i<n;i++) 49 pile[i].push_back(i); 50 while(cin>>s1>>a>>s2>>b) 51 { 52 int pa,pb,ha,hb; 53 find_block(a,pa,ha); 54 find_block(b,pb,hb); 55 if(pa=pb) 56 continue; 57 if(s2=="onto") 58 clear_above(pb,hb); 59 if(s1=="move") 60 clear_above(pa,ha); 61 pile_onto(pa,ha,pb); 62 } 63 print(); 64 return 0; 65 }