标签:
题解:
1、这道题总共有四种堆积木的方法,(1)是move onto 就是将a,b上面的积木恢复到原来的位置。将a堆在b上。(2)是move over 就是将a上面的积木恢复到原来的位置,将a堆在b所在的那一摞积木的最上面。(3)是pile onto 就是将b上面的积木恢复到原来的位置,将a及其上面的积木堆在b上。(4)pile over 就是将a及其上面的积木堆在b所在那一摞积木的最上面。
2、其实如果a,b上面都没有积木,那么pile onto、pile over 其实是和move onto、move over没有区别的,a,b上有积木,区别就在于是否需要将a或b上的积木恢复。所以可以拆分为小函数。(1)是函数restore(int c),将c上的积木恢复。(2)是函数pile(int a,int b)将a及其以上积木,堆在含有b那一摞积木的最上面。
3、那么四种方法可以简化为三步 ,(1)如果是move,那么就restore(a);(2)如果是onto 就restore(b);(3)最后pile(a,b)即可。
4、执行操作过程中,如果a==b 或者a和b在同一摞,则为无效指令,跳过即可,判断在islegal()中。
5、特别需要注意的是输出格式,最后一行的回车不可少,每一行每一个数字前面有一个空格,最后一个数字之后没有空格,不然算法是对了,但是PE就太忧伤了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int A[30][30],x,y,z,w; char s1[10],s2[10]; int a,b,op,n; void Find( int c, int &u, int &v){ for ( int i=0;i<n;i++) for ( int j=0;j<n;j++) if (A[i][j]==c){ u=i;v=j;} } bool islegal(){ if (a==b) return 0; Find(a,x,y); Find(b,z,w); if (x==z) return 0; return 1; } void restore( int p){ Find(p,x,y); while (A[x][++y]!=-1){ int t= A[x][y]; A[t][0]=t; A[x][y]=-1; } } void pile( int a, int b){ Find(a,x,y); Find(b,z,w); while (A[z][++w]!=-1);w--; while (A[x][y]!=-1){ A[z][++w]=A[x][y]; A[x][y++]=-1; } } int main(){ //freopen("1.in","r",stdin); scanf ( "%d" ,&n); for ( int i=0;i<n;i++){ for ( int j=0;j<n;j++)A[i][j]=-1; A[i][0]=i; } while ( scanf ( "%s" ,s1)!=EOF && s1[0]!= ‘q‘ ){ scanf ( "%d%s%d" ,&a,s2,&b); if (islegal()==0) continue ; if (s1[0]== ‘m‘ )restore(a); if (s2[1]== ‘n‘ )restore(b); pile(a,b); } for ( int i=0;i<n;i++){ printf ( "%d:" ,i); int k=0; while (A[i][k]!=-1) printf ( " %d" ,A[i][k++]); printf ( "\n" ); } } |
以下是测试数据:
sample input
10
move 6 on 5
move 4 over 8
pile 9 on 0
move 3 on 9
pile 1 on 9
move 1 over 0
pile 7 over 6
move 1 on 8
pile 5 on 3
move 2 on 5
quit
7
move 6 over 5
pile 3 on 0
pile 5 on 1
move 2 on 0
pile 0 on 1
move 0 over 2
move 1 over 1
move 5 over 3
pile 6 over 5
pile 3 over 1
quit
sample output
0: 0 9
1:
2:
3: 3 5 2
4: 4
5:
6: 6
7: 7
8: 8 1
9:
0:
1: 1 0 2 3 5 6
2:
3:
4: 4
5:
6:
Winter-2-STL-D The Blocks Problem 解题报告及测试数据
标签:
原文地址:http://www.cnblogs.com/gzdaijie/p/4298826.html