例题5-2 木块问题 The Blocks Problem Uva 101

#include<stdio.h>
#include<vector>
#include<string.h>
#define N 40
using namespace std;

vector<int>pile[N];
int n;


void find_block(int a, int &p, int &h)
{
	for(p = 0; p <= n - 1; p ++)
	{
		for(h = 0; h < pile[p].size(); h ++)
		{
			if(pile[p][h] == a)
			{
				return;
			}
		}
	}
	return;
}

void clear_above(int p, int h)
{
	int b, i;
	for(i = h + 1; i < pile[p].size(); i ++)
	{
		b = pile[p][i];
		pile[b].push_back(b);
	}
	pile[p].resize(h + 1);
	return;
}

void pile_onto(int p, int h, int p2)
{
	int i;
	for(i = h; i < pile[p].size(); i ++)
	{
		pile[p2].push_back(pile[p][i]);
	}
	pile[p].resize(h);
	return;
}

void print()
{
	int i, j;
	for(i = 0; i <= n - 1; i ++)
	{
		printf("%d: ", i);
		for(j = 0; j < pile[i].size(); j ++)
		{
			printf("%d ", pile[i][j]);
		}
		printf("\n");
	}
	return;
}

int main(void)
{
	int a, b, i;
	int pa, ha, pb, hb;
	char s1[100], s2[100];
	scanf("%d", &n);
	for(i = 0; i <= n - 1; i ++)
	{
		pile[i].push_back(i);
	}
	while(scanf("%s%d%s%d", s1, &a, s2, &b) != EOF)
	{
		find_block(a, pa, ha);
		find_block(b, pb, hb);
		if(pa == pb)
		{
			continue;
		}
		if(strcmp(s1, "move") == 0)
		{
			clear_above(pa, ha);
		}
		if(strcmp(s2, "onto") == 0)
		{
			clear_above(pb, hb);
		}
		pile_onto(pa, ha, pb);
		print();
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/starlight321/article/details/80212725
今日推荐