题目链接:Uva101 也可以在这看:Vjudge 先上代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
vector<int> pile[30];
typedef pair<int, int> P;
int n;
P find_block(int num)
{
P pos;
for (int i=0; i < n; i++) {
for (int j=0; j < pile[i].size(); j++) {
if (pile[i][j] == num) {
pos.first = i;
pos.second = j;
}
}
}
return pos;
}
void clear_pile(int num) //p表示哪一堆,h表示高度
{
P pos = find_block(num);
int p = pos.first; int h = pos.second;
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);
}
int main()
{
int a, b;
string com1, com2;
P des;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
pile[i].push_back(i);
}
while (1) {
cin >> com1;
if (com1 == "quit") break;
cin >> a >> com2 >> b;
if (find_block(a).first == find_block(b).first) continue;
if (com1 == "move"&&com2 == "onto") {
clear_pile(a);
clear_pile(b);
int bpile = find_block(b).first;
int apile = find_block(a).first;
pile[bpile].push_back(a);
int si = pile[apile].size();
pile[apile].resize(si - 1);
}
else if (com1 == "move"&&com2 == "over") { //这段有问题
clear_pile(a);
int apile = find_block(a).first;
int bpile = find_block(b).first;
int si = pile[apile].size();
pile[bpile].push_back(a);
pile[apile].resize(si - 1);
}
else if (com1 == "pile"&&com2 == "onto") { //这个操作是先将b上方的方块归位,然后将a以及a上方的方块整体移动到b的上方
int apile = find_block(a).first;
int bpile = find_block(b).first;
int h = find_block(a).second;
int ori_a_size = pile[apile].size();
clear_pile(b); //将b上方的方块归位
for (int i = find_block(a).second; i < ori_a_size; i++) { //循环从b的高度开始(这里是否要+1?)
pile[bpile].push_back(pile[apile][i]);
}
pile[apile].resize(h);
}
else if (com1 == "pile"&&com2 == "over") { //这段有问题
int bpile = find_block(b).first;
int apile = find_block(a).first;
int ori_a_si = pile[apile].size();
int h = find_block(a).second;
for (int i = find_block(a).second; i < ori_a_si; i++) {
pile[bpile].push_back(pile[apile][i]);
}
pile[apile].resize(h);
}
}
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");
}
return 0;
}
思路上其实很直接,就是用vector来模拟方块堆,然后用一个数组将这些vector存起来。放方块的操作用push_back即可。原本是写了一个move函数用来进行放方块的操作的,但后来发现这样做容易出错而且自己也写得不好........ 下面是我写的超丑move函数qwq:
void move(int obj, int des, int h) //obj表示要移动的方块,des表示目的地方块,h表示要移动的方块在移动前所处的高度
{
int desp = find_block(des).first; //找到目的地方块处于哪一堆
int objp = find_block(obj).first; //找到要移动的方块处于哪一堆
int ori_hei=pile[find_block(obj).first].size();
for (int i = h; i < pile[objp].size(); i++) {
pile[desp].push_back(pile[objp][i]); //将要移动的方块以及要移动的方块上面的方块(如果有的话)移动到目的地方块的上面
}
pile[objp].resize(h);
}
实际使用的时候很不好用,主要是参数设计的不好。