- 题目大意
先理解给出的四个移动方式:
- move a onto b:把木块a、b上的木块放回各自的原位,再把a放到b上;
-
move a over b:把a上的木块放回各自的原位,再把a发到含b的堆上;
-
pile a onto b:把b上的木块放回各自的原位,再把a连同a上的木块移到b上;
-
pile a over b:把a连同a上木块移到含b的堆上。
然后根据条件来移动即可。
- 解题思路
如果把每个情况都写出来肯定很麻烦,所以首先先找出他们的共同点然后来写出算法,这样就会简单很多,如
- 找到某木块
- 将某木块上的木块放回原位
- 将某木块及其上面木块移动到另一个木块上
- 代码
#include<string>
#include<vector>
#include<iostream>
using namespace std;
int n;
vector<int> num[24];
void find(int a, int & i, int &j )
{
for (i = 0; i < n; i++)
for (j = 0; j< num[i].size(); j++)
if (num[i][j] == a) return;
}
void over(int j, int h)
{
for (int i = h + 1; i < num[j].size(); i++)
{
int b = num[j][i];
num[b].push_back(b);
}
num[j].resize(h + 1);
}
void renew(int p, int h, int g )
{
for (int i = h; i < num[p].size(); i++)
num[g].push_back(num[p][i]);
num[p].resize(h);
}
int main()
{
int a, b;
cin >> n;
string s1, s2;
for (int i = 0; i < n; i++)
num[i].push_back(i);
while (cin >> s1)
{
if (s1 == "quit")
{
for (int i = 0; i < n; i++)
{
cout << i<<":";
for (int j = 0; j < num[i].size(); j++)
cout <<" "<<num[i][j];
cout << endl;
}
break;
}
cin >> a >> s2 >> b;
int q, w, e, r;
find(a, q, e);
find(b, w, r);
if (q == w)
continue;
if (s2 == "onto")
over(w, r);
if (s1 == "move")
over(q, e);
renew(q, e, w);
}
system("pause");
return 0;
}