UVa 101 The Blocks Problem

本文介绍了一个基于C++实现的木块堆叠模拟器,通过使用vector容器管理木块的移动与堆叠,实现了“move”与“onto”两种基本操作。文中详细解释了vector的操作方法及如何通过这些操作来更新木块的状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先每一个木块自成一堆,并分配一个编号。

因为不确定每一个木块堆的高度,所以可以用vector来表示每一堆的木块编号。


P.S. vector的常用操作:

1. vec.push_back()     向尾部插入元素

2. vec.size()    取数组元素个数

3. vec.clear()    清空数组

4.插入元素:    vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;


5.删除元素:    vec.erase(vec.begin()+2);删除第3个元素

(vector可以使用下标访问元素,而queue, stack不能)


注意几个细节:

1.每一次移动木块时是整体挪动,所以插入数组时要从下往上插入。

2.归位或挪动的循环最大值是pile[x].size(),而不是n


#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;

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

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

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

void moveon(int pa, int h, int pb) {
	for (int i=h; i<pile[pa].size(); i++) pile[pb].push_back(pile[pa][i]);
	pile[pa].resize(h);
}

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

int main()
{
	cin>>n;
	for (int i=0;i<n;i++) pile[i].push_back(i);
	
	string s1,s2;
	int a,b;
	while (cin >> s1 >> a >> s2 >> b && s1!="quit") {
		int pa,ha,pb,hb;
		find_b(a, pa, ha);
		find_b(b, pb, hb);
		if (pa == pb) continue;
		if (s1 == "move") moveback(pa, ha);
		if (s2 == "onto") moveback(pb, hb);
		
		moveon(pa, ha, pb);
	}
	print();
	
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值