1. 程式人生 > >E - The Blocks Problem ( UVA - 101)

E - The Blocks Problem ( UVA - 101)

num continue blog while break ++ log pos 很多

- 題目大意

先理解給出的四個移動方式:

  1. move a onto b:把木塊a、b上的木塊放回各自的原位,再把a放到b上;
  1. move a over b:把a上的木塊放回各自的原位,再把a發到含b的堆上;

  2. pile a onto b:把b上的木塊放回各自的原位,再把a連同a上的木塊移到b上;

  3. pile a over b:把a連同a上木塊移到含b的堆上。

然後根據條件來移動即可。

- 解題思路

如果把每個情況都寫出來肯定很麻煩,所以首先先找出他們的共同點然後來寫出算法,這樣就會簡單很多,如

  1. 找到某木塊
  2. 將某木塊上的木塊放回原位
  3. 將某木塊及其上面木塊移動到另一個木塊上

- 代碼

#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;
	}

  

E - The Blocks Problem ( UVA - 101)