看着算法书看到了这一题,想着不能只看不做,就想着做了一下
算法书上的描述太抽象了,就网上找了其他的描述
当然去看英文描述是最准确的,算法书上说是哪一个oj网来着?我给忘了
STL还是很好用的
代码如下:
#include<vector>
#include<iostream>
#include<string>
using namespace std;
void search_num(int a, int &x, int &y);//找到a的位置
void homing(const int &x, const int &y);//第x堆,第y高的木块上方的木块归位
void move(const int &x, const int &y, const int &z);//第x堆,第y高的木块和上方的木块放在第z堆上方
vector<vector<int>> blocks;
int N;
int main(void)
{
cin >> N, blocks.resize(N);
for(int i = 0; i < N; i++)
blocks[i].push_back(i);
string str1, str2;
while(true)
{
cin >> str1;
if(str1 == "quit") break;
int a, b, xa, ya, xb, yb;
cin >> a >> str2 >> b;
search_num(a, xa, ya), search_num(b, xb, yb);
if(xa == xb) continue;
if(str1 == "move")
{
homing(xa, ya);
if(str2 == "onto") homing(xb, yb);
blocks[xa].pop_back(), blocks[xb].push_back(a);
}
else
{
if(str2 == "onto") homing(xb, yb);
move(xa, ya, xb);
}
}
for(int i = 0; i < N; i++)
{
cout << i << ':';
for(auto it = blocks[i].begin(); it != blocks[i].end(); it++)
cout << ' ' << *it;
cout << endl;
}
return 0;
}
void search_num(int a, int &x, int &y)
{
for(x = 0; x < N; x++)
for(y = 0; y < blocks[x].size(); y++)
if(blocks[x][y] == a)
return;
return;
}
void homing(const int &x, const int &y)
{
int n_tmp = y;
while(++n_tmp < blocks[x].size())
blocks[blocks[x][n_tmp]].push_back(n_tmp);
blocks[x].resize(y + 1);
return;
}
void move(const int &x, const int &y, const int &z)//第x堆,第y高的木块和上方的木块放在第z堆上方
{
int n_tmp = y - 1;
while(++n_tmp < blocks[x].size())
blocks[z].push_back(blocks[x][n_tmp]);
blocks[x].resize(y);
return;
}