堆积木

堆积木

Description
小白有 n 块积木,编号分别为 1 到 n。一开始,小白把第 i 块积木放在位置 i。小白进行 m 次操作,每次操作,小白把位置 b 上的积木整体移动到位置 a 上面。比如 1 位置的积木是 1,2 位置的积木是 2,那么把位置 2 的积木移动到位置 1 后,位置 1 上的积木从下到上依次为 1,2。
Input

第一行输入 2 个整数 n,m(1 <= n <= 10000, 0 <= m <= 10000)。接下来 m 行,每行输入 2 个整数 a, b(1 <= a, b <= n),如果a,b 相等则本次不需要移动。

Output

输出 n 行,第 i 行输出位置 i 从下到上的积木编号,如果该行没有积木输出一行空行。

Sample Input 1

2 2
1 2
1 2
Sample Output 1

1 2
Sample Input 2
4 4
3 1
4 3
2 4
2 2
Sample Output 2
2 4 3 1
——摘自YCOJ
基础数据结构,是这道题的核心。这道题不算难,就是将积木不断地重叠放置,并输出编号。基础数据结构我就不多做解释,思想代码体现:

#include <bits/stdc++.h>
using namespace std;
vector<vector<int>>vec(100000);//定义动态二维数组 
int main(){
	int n,m;
	cin >> n >> m;//输入n,m 
	for(int i=1;i <= n;i++){
		vec[i].push_back(i);//插入数组 
	}
	for(int i=0;i<m;i++){
	 int a,b;
	 cin >> a >> b;//输入a,b 
	 if(a==b){//如果a==b,则本次不需要移动,跳出循环 
	 continue;
	 }
	 for(int j=0;j < vec[b].size();j++){//j循环vec[b]的长度 
	 		vec[a].push_back(vec[b][j]); 
		 }//插入vec[b][j] 
		 vec[b].clear();//清空vec[b] 
	 }
	for(int i=1;i<=n;i++){
		for(int j=0;j<vec[i].size();j++){//j循环vec[i]的长度
		if(j != 0){
		cout << " " << vec[i][j];
		}else{
			cout << vec[i][j];//由下到上的积木编号 
		}
		}
		cout << endl;//换行 
	}
	return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值