POJ 1208 The Blocks Problem --vector

http://poj.org/problem?id=1208

晚点仔细看

https://blog.csdn.net/yxz8102/article/details/53098575

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<iostream>
 5 #include<stdlib.h>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #include<string>
10 #define mem(a) memset(a,0,sizeof(a))
11 using namespace std;
12 const long long  N=1e9+5;
13 #define LL long long
14 vector<int> pile[30];
15 int n;
16 
17 //查找木块a所在的pile和height
18 void find_block(int a,int &p,int &h) //引用,相当于直接用实参
19 {
20     for(p=0;p<n;p++)
21     {
22         for(h=0;h<pile[p].size();h++)
23         {
24             if(pile[p][h]==a)  return;
25 //vector就像一个二维数组,只是第一维大小固定(30),二维大小不固定。
26         }
27     }
28 }
29 //把p堆高度为h的木块上方所有的木块移回原位置
30 void clear_above(int p,int h)
31 {
32     for(int i=h+1;i<pile[p].size();i++)
33     {
34         int t=pile[p][i];
35         pile[t].push_back(t); ////把标号为t的木块放回原位,即t堆
36     }
37   pile[p].resize(h+1); //重新定义p堆的长度
38 }
39  //把p堆高度为h及其上方的木块整体移到p2的得尾部
40 void pile_onto(int p,int h,int p2)
41 {
42     for(int i=h;i<pile[p].size();i++)
43         pile[p2].push_back(pile[p][i]); //??
44        pile[p].resize(h);
45 }
46 void print()
47 {
48     for(int i=0;i<n;i++)
49     {
50     printf("%d:",i);
51     for(int j=0;j<pile[i].size();j++)
52     {
53         printf(" %d",pile[i][j]);
54     }
55     printf("\n");
56     }
57 }
58 int main()
59 {
60    int a,b;
61    scanf("%d",&n);
62    string s1,s2;
63    for(int i=0;i<n;i++)
64    {
65        pile[i].push_back(i);
66    }
67    while(cin>>s1)
68    {
69        if (s1=="quit") break;
70        cin>>a>>s2>>b;
71        int pa,pb,ha,hb;
72        find_block(a,pa,ha);
73        find_block(b,pb,hb);
74        if(pa==pb) continue;
75        if(s2=="onto") clear_above(pb,hb);
76        if(s1=="move") clear_above(pa,ha);
77        pile_onto(pa,ha,pb);
78    }
79    print();
80     return 0;
81 }
View Code

猜你喜欢

转载自www.cnblogs.com/XXrll/p/10295066.html