直接模擬四個操作
#include <iostream>
using namespace std;
#include <vector>
#include <string>
vector<int> data[30];
int n;
void move_onto(int a, int b) {
int row_a, row_b;
int i, j;
if (a==b)
return;
for (i=0;i<n;i++) {
for (j=0;j<data[i].size();j++) {
if (data[i][j]==a) {
row_a = i;
}
if (data[i][j]==b) {
row_b = i;
}
}
}
if (row_a==row_b)
return;
j=data[row_a].size()-1;
while (data[row_a][j]!=a) {
i = data[row_a][j];
data[row_a].pop_back();
data[i].insert(data[i].begin(), i);
//data[i].push_front(i);
j=data[row_a].size()-1;
}
j=data[row_b].size()-1;
while (data[row_b][j]!=b) {
i=data[row_b][j];
data[row_b].pop_back();
data[i].insert(data[i].begin(), i);
//data[i].push_front(i);
j=data[row_b].size()-1;
}
data[row_a].pop_back();
data[row_b].push_back(a);
}
void move_over(int a, int b) {
int row_a, row_b;
int i, j;
if (a==b)
return;
for (i=0;i<n;i++) {
for (j=0;j<data[i].size();j++) {
if (data[i][j]==a)
row_a=i;
if (data[i][j]==b)
row_b=i;
}
}
if (row_a==row_b)
return;
j=data[row_a].size()-1;
while (data[row_a][j]!=a) {
i = data[row_a][j];
data[row_a].pop_back();
data[i].insert(data[i].begin(), i);
//data[i].push_front(i);
j=data[row_a].size()-1;
}
data[row_a].pop_back();
data[row_b].push_back(a);
}
void pile_onto(int a, int b) {
int row_a, row_b;
int i, j;
if (a==b)
return;
for (i=0;i<n;i++) {
for (j=0;j<data[i].size();j++) {
if (data[i][j]==a)
row_a=i;
if (data[i][j]==b)
row_b=i;
}
}
if (row_a==row_b)
return;
j=data[row_b].size()-1;
while (data[row_b][j]!=b) {
i=data[row_b][j];
data[row_b].pop_back();
data[i].insert(data[i].begin(), i);
//data[i].push_front(i);
j=data[row_b].size()-1;
}
for (i=0;i<data[row_a].size();i++) {
if (data[row_a][i]==a)
break;
}
for (j=i;j<data[row_a].size();j++) {
data[row_b].push_back(data[row_a][j]);
}
while (data[row_a].size()>i)
data[row_a].pop_back();
}
void pile_over(int a, int b) {
int row_a, row_b;
int i, j;
if (a==b)
return;
for (i=0;i<n;i++) {
for (j=0;j<data[i].size();j++) {
if (data[i][j]==a)
row_a = i;
if (data[i][j]==b)
row_b = i;
}
}
if (row_a==row_b)
return;
for (i=0;i<data[row_a].size();i++) {
if (data[row_a][i]==a)
break;
}
for (j=i;j<data[row_a].size();j++)
data[row_b].push_back(data[row_a][j]);
while (data[row_a].size()>i)
data[row_a].pop_back();
}
int main() {
int i,j;
int a,b;
string cmd, type;
while (cin >> n) {
for (i=0;i<30;i++) {
data[i].clear();
data[i].push_back(i);
}
cin >> cmd;
while (cmd!="quit") {
cin >> a >> type >> b;
if (cmd=="move" && type=="onto")
move_onto(a,b);
else if (cmd=="move" && type=="over")
move_over(a,b);
else if (cmd=="pile" && type=="onto")
pile_onto(a,b);
else if (cmd=="pile" && type=="over")
pile_over(a,b);
cin >> cmd;
}
for (i=0;i<n;i++) {
cout << i << ":";
for (j=0;j<data[i].size();j++) {
cout << " " << data[i][j];
}
cout << endl;
}
}
return 0;
}