UVA(木块问题)101, 好开森好开森。。。。虽然花了很长时间,不过能一次就AC也是蛮开心的,用c++写效率就是不错
//叠木块其实是一个二维空间,每个木块都有纵横坐标
#include<iostream>
#include<vector>
#include<string>
using namespace std;
//block用于记录木块所在位置,x是位于哪一叠木块,y是位于该叠木块的第几个
struct block{
int x;
//y为从下往上0到n
int y;
};
//定义木块的二维空间
vector<vector<int>> Piles;
//用于快速索引,查找到某编号的木块所在位置
vector<block> location;
int all;
//该函数用于将叠在木块上方的所有木块还原到原位置
void return_to_init(int a)
{
int k = location[a].x;
//判断a上方是否有木块,有才需要还原
if (Piles[k].size() - 1 > location[a].y)
for (vector<int>::size_type i = Piles[k].size() - 1; i > location[a].y; i--)
{
int num = Piles[k][i];
Piles[k].pop_back();
Piles[num].insert(Piles[num].begin(), num);
location[num].x = num;
location[num].y = 0;
}
}
//该函数用于将Pile_a叠到Pile_b上
void move(int a, int b)
{
int k = location[a].x;
int count = 0;
for (vector<int>::size_type i = location[a].y; i < Piles[k].size(); i++){
int num = Piles[k][i];
Piles[location[b].x].push_back(num);
location[num].x = location[b].x;
location[num].y = Piles[location[b].x].size() - 1;
count++;
}
for (int i = 1; i <= count; i++)
Piles[k].pop_back();
}
//用于初始化记录木块位置的location 和 构建初始二维空间Piles
void init()
{
for (int i = 0; i < all; i++)
{
block k;
k.x = i;
k.y = 0;
location.push_back(k);
vector<int> l;
l.clear();
l.push_back(i);
Piles.push_back(l);
}
}
//用于最后显示数据
void display()
{
for (vector<vector<int>>::size_type i = 0; i < all; i++)
{
cout << i << ':';
for (vector<int>::size_type j = 0; j < Piles[i].size(); j++)
cout << ' ' << Piles[i][j];
cout << endl;
}
}
/***主函数***/
int main()
{
int a, b;
string str1, str2;
while (cin >> all){
init();
while (cin >> str1 && str1 != "quit"){
cin >> a;
cin >> str2;
cin >> b;
if (location[a].x != location[b].x){
if (str1 == "move") return_to_init(a);
if (str2 == "onto") return_to_init(b);
//将Pile_a移动到Pile_b上
move(a, b);
}
}
display();
}
return 0;
}