B -- POJ 1208 The Blocks Problem
参考:https://blog.csdn.net/yxz8102/article/details/53098575
https://www.cnblogs.com/tanjuntao/p/8678927.html
1 #include <iostream>
2 #include <cstdio>
3 #include <vector>
4 #define N 30
5 using namespace std;
6 int n,a,b;
7 string s,sa;
8 vector<int> v[N];
9 void init()
10 {
11 int i;
12 for (i=0;i<N;i++)
13 {
14 v[i].clear();
15 v[i].push_back(i);
16 }
17 }
18 void test()
19 {
20 cout<<s<<a<<sa<<b<<endl;
21 }
22 bool judge(int& ba,int& bb,int& ha,int& hb)//判断输入合法性 ,地址传参
23 {
24 int i,j;
25 for (i=0;i<n;i++)
26 {
27 for (j=0;j<v[i].size();j++)
28 {
29 if (v[i][j]==a)
30 {
31 ba=i;
32 ha=j;
33 }
34 if (v[i][j]==b)
35 {
36 bb=i;
37 hb=j;
38 }
39 }
40 }
41 if (ba==bb)
42 {
43 return true;
44 }
45 else
46 {
47 return false;
48 }
49 }
50 void clear(int block,int high)
51 {
52 int i;
53 for (i=high+1;i<v[block].size();i++)
54 {
55 int t=v[block][i];
56 v[t].push_back(t);
57 }
58 v[block].resize(high+1);
59 }
60 void pile(int pba,int pbb,int pha,int phb)
61 {
62 int i;
63 for (i=pha;i<v[pba].size();i++)
64 {
65 v[pbb].push_back(v[pba][i]);
66 }
67 v[pba].resize(pha);//重设长度会删除后面元素~
68 }
69 void show()
70 {
71 int i;
72 for (i=0;i<n;i++)
73 {
74 printf("%d:",i);
75 for (int j=0;j<v[i].size();j++)
76 {
77 printf(" %d",v[i][j]);//依据方便实用printf,cout!!!
78 }
79 printf("\n");
80 }
81 }
82 int main()
83 {
84 while (scanf("%d",&n)!=EOF)
85 {
86 int i;
87 init();
88 while (cin>>s)
89 {
90 if (s=="quit")
91 {
92 break;
93 }
94 cin>>a>>sa>>b;
95 int ba,bb,ha,hb;//ba为a的堆,ha为a在堆的高度
96 if (judge(ba,bb,ha,hb))//多用传参形式,少用全局变量!!!
97 {
98 continue;
99 }
100 if (s=="move")
101 {
102 clear(ba,ha);
103 }
104 if (sa=="onto")
105 {
106 clear(bb,hb);
107 }
108 pile(ba,bb,ha,hb);
109 }
110 show();
111 }
112
113 return 0;
114 }
转载于//www.cnblogs.com/hemeiwolong/p/9377058.html
还没有评论,来说两句吧...