题目:给你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 #include2 #include 3 #include //该头文件中的 vector 是一个不定长的数组 4 #include 5 using namespace std; 6 const int maxn=30; 7 int n; 8 vector pile[maxn]; 9 void find_block(int a,int& p,int& h)10 {11 for(p=0;p >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 }