UVA101-5.2-The Blocks Probrem
题目描述:
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=835&problem=37&mosmsg=Submission+received+with+ID+18662361
学习C++的第二题。
学会了vector类型。不定长的数组。
列:vector vec [30];
这样就是定义了一个数组,数组的每一个元素都是一个vector类型。这样就类似于一个二维数组,但是其中一维是不定长的。
另外学到了几个于此相关的函数。
若 vector vec;
则:vec.push_back()在尾部添加元素
vec.pop_back()删除元素
vec.clear()清空
vec.resize()改变大小,如:vec.resize(h+1) 只保留下标0~h的元素
给出代码:
#include <iostream>
#include<string>
#include<vector>
#include<iostream>
#include<cstdio>
using namespace std;
vector <int> vec[30];
void find_blocks(int& p,int& h,int n,int mark)
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<vec[i].size();j++)
{
//printf("i=%d j=%d\n",i,j);
if(vec[i][j]==mark)
{
p=i;
h=j;
return;
}
}
return;
}
void clear_blocks(int p,int h)
{
int i;
for(i=h+1;i<vec[p].size();i++)
{
int a=vec[p][i];
vec[a].push_back(a);//把木块b放回原位
}
vec[p].resize(h+1);//pile只应该保留下标0~h的元素。
}
void push_blocks(int ha,int pa,int pb)
{
int i,j;
for(i=ha;i<vec[pa].size();i++)
{
int a=vec[pa][i];
vec[pb].push_back(a);
}
vec[pa].resize(ha);
}
void print(int n)
{
int i,j;
for(i=0;i<n;i++)
{
printf("%d:",i);
for(j=0;j<vec[i].size();j++)
{
printf(" %d",vec[i][j]);
}
printf("\n");
}
}
int main()
{
string sh1,sh2;
int a,b;
int n;
cin>>n;
int i;
for(i=0;i<n;i++)
{
vec[i].push_back(i);
}
while(cin>>sh1)
{
if(sh1=="quit")
break;
cin>>a>>sh2>>b;
int pa,pb,ha,hb;
find_blocks(pa,ha,n,a);
find_blocks(pb,hb,n,b);
if(pa==pb)
continue;
if(sh2=="onto")
clear_blocks(pb,hb);
if(sh1=="move")
clear_blocks(pa,ha);
push_blocks(ha,pa,pb);
}
print(n);
return 0;
}