#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <string>
#define OPEN_DEBUG 1
using namespace std;
int main()
{
int n;
const string quit_flag = "quit";
const string ope_move = "move";
const string ope_pile = "pile";
const string ope_onto = "onto";
const string ope_over = "over";
while(cin >> n)
{
int *trace_block = new int[n];
vector<int> *blocks = new vector<int>[n];
string ope_command;
string ope_type, ope_pos;
int a, b;
for(int i = 0; i < n; i++)
{
blocks[i].push_back(i);
trace_block[i] = i;
}
while((cin >> ope_type) && !(ope_type == quit_flag))
{
cin >> a >> ope_pos >> b;
if(ope_type != ope_move && ope_type != ope_pile)
continue;
if(ope_pos != ope_onto && ope_pos != ope_over)
continue;
if(a < 0 || a >= n || b < 0 || b >= n)
continue;
int trace_block_a = trace_block[a];
int trace_block_b = trace_block[b];
int size_a = blocks[trace_block_a].size() - 1;
int size_b = blocks[trace_block_b].size() - 1;
if (trace_block_a == trace_block_b)
continue;
if(ope_type == ope_move)
{
if(ope_pos == ope_onto)
{
while(blocks[trace_block_a][size_a] != a)
{
int pop_in_stack_a = blocks[trace_block_a][size_a];
blocks[pop_in_stack_a].push_back(pop_in_stack_a);
trace_block[pop_in_stack_a] = pop_in_stack_a;
blocks[trace_block_a].pop_back();
size_a--;
}
while(blocks[trace_block_b][size_b] != b)
{
int pop_in_stack_b = blocks[trace_block_b][size_b];
blocks[pop_in_stack_b].push_back(pop_in_stack_b);
trace_block[pop_in_stack_b] = pop_in_stack_b;
blocks[trace_block_b].pop_back();
size_b--;
}
trace_block[a] = trace_block[b];
blocks[trace_block_a].pop_back();
blocks[trace_block_b].push_back(a);
}
else
{
while(blocks[trace_block_a][size_a] != a)
{
int pop_in_stack_a = blocks[trace_block_a][size_a];
blocks[pop_in_stack_a].push_back(pop_in_stack_a);
trace_block[pop_in_stack_a] = pop_in_stack_a;
blocks[trace_block_a].pop_back();
size_a--;
}
trace_block[a] = trace_block[b];
blocks[trace_block_a].pop_back();
blocks[trace_block_b].push_back(a);
}
}
else
{
if(ope_pos == ope_onto)
{
while(blocks[trace_block_b][size_b] != b)
{
int pop_in_stack_b = blocks[trace_block_b][size_b];
blocks[pop_in_stack_b].push_back(pop_in_stack_b);
trace_block[pop_in_stack_b] = pop_in_stack_b;
blocks[trace_block_b].pop_back();
size_b--;
}
int track_flag = 0;
int start_num = 0;
for(int it = 0; it <= size_a; it++)
{
int tmp = blocks[trace_block_a][it];
if(tmp == a)
{
track_flag = 1;
start_num = it;
}
if(track_flag == 1)
{
blocks[trace_block_b].push_back(tmp);
trace_block[tmp] = trace_block_b;
}
}
#if(OPEN_DEBUG == 1)
cout << "Onto runs here" << endl;
#endif
blocks[trace_block_a].erase(blocks[trace_block_a].begin()+start_num, blocks[trace_block_a].begin() + size_a + 1);
}
else
{
int track_flag = 0;
int start_num = 0;
#if(OPEN_DEBUG == 1)
cout << a << "is" << size_a << endl;
#endif
for(int it = 0; it <= size_a; it++)
{
int tmp = blocks[trace_block_a][it];
#if(OPEN_DEBUG == 1)
cout << it << " " << tmp << endl;
#endif
if(tmp == a)
{
track_flag = 1;
start_num = it;
}
if(track_flag == 1)
{
blocks[trace_block_b].push_back(tmp);
trace_block[tmp] = trace_block_b;
}
}
blocks[trace_block_a].erase(blocks[trace_block_a].begin()+start_num, blocks[trace_block_a].begin() + size_a + 1);
}
}
#if(OPEN_DEBUG == 1)
for (int i = 0; i < n; i++)
{
cout << i << ":";
for (vector<int>::iterator it = blocks[i].begin(); it != blocks[i].end(); ++it)
{
cout << " " << *it;
}
cout << " trace" << trace_block[i] << endl;
}
#endif
}
for(int i = 0; i < n; i++)
{
cout << i << ":";
for(vector<int>::iterator it = blocks[i].begin() ; it != blocks[i].end(); ++it)
{
cout << " " << *it;
}
cout << endl;
}
//for(int i = 0; i < n; i++)
// delete blocks[i];
delete []blocks;
delete trace_block;
}
return 0;
}
UVa 101: The Blocks Problem
最新推荐文章于 2021-01-26 13:41:28 发布