uva101---vector 的使用
code:
/*
vector 使用;不定长数组,类似于链表
vector<T>a ---- a.size() //a的大小
---- a.resize() //改变a的大小
---- a.pusb_back() //将向尾部添加元素
---- a.pop_back() // 删除最后一个元素
---- a.clear() //清空
---- a.empty() // 测试是否为空
//vector 本质上是一个指针数组
*/
/*
思路: move a onto b 将a,b上方木块归位,然后将a移到b上
move a over b 将a 上方木块归位,然后将a移到b上方
pile a onto b 将b上方木块归位,将a的堆放入b上面
pile a over b 将a的堆移到b的堆上面
抽取共性,然后写一个函数,直接调用ok
首先 归位 -----需要找到木块所在的位置
*/
#include<cstdio>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
const int maxn = 30;
vector<int> pile[maxn];//每个pile都是一个vector
int n;
void find_block(int a,int & p,int & h){ //找到木块a所在的的堆还有其高度 ---引用的使用
for(p= 0;p < n;p++)
for(h = 0;h < pile[p].size();h++)
if(pile[p][h] == a) return;
}
void clear_above(int p,int h){//将木块p,其高度h上面的木块全部归位
for(int i= h+1;i<pile[p].size();i++){
int b = pile[p][i];
pile[b].push_back(b);
}
pile[p].resize(h+1);//pile 只应该留下0-h个元素
}
void pile_onto(int p,int h,int p2){//将第p堆高度为h的木块移动到p2堆的顶部
for(int i = h;i<pile[p].size();i++)
pile[p2].push_back(pile[p][i]); //包括pile[p].h
pile[p].resize(h);
}
void print(){// 打印结果
for(int i = 0;i < n;i++){
printf("%d:",i);
for(int j = 0;j < pile[i].size();j++)
printf(" %d",pile[i][j]);
printf("\n");
}
}
int main(){
int a,b;
string s1,s2;
cin >> n;
for(int i =0;i<n;i++) pile[i].push_back(i);//初始化
while(cin >> s1 && s1 != "quit" &&cin>> a >> s2 >> b){
int pa,pb,ha,hb; //堆的序号及所在堆的高度
find_block(a,pa,ha);
find_block(b,pb,hb);
if(pa == pb) continue; // 非法指令
if(s2 == "onto") clear_above(pb, hb);
if(s1 == "move") clear_above(pa, ha);
pile_onto(pa, ha, pb);
}
print();
return 0;
}
浙公网安备 33010602011771号