堆积木
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;
}