您的位置:首页 > 其它

UVa 101: The Blocks Problem

2017-01-08 14:54 447 查看
#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
;
vector<int> *blocks = new vector<int>
;
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 traceblock