题目:
n块积木,编号1到n,初始时,第i块放在第i个位置。现在,进行a b操作,每次操作把b位置积木全放到a位置上。输出操作完之后每个位置上的木块。
输入:n,m。n代表有n个积木,m代表有m个操作,接下来m行是m个操作。如果ab相等则本次不移动木块。
输出,每个位置从下到上积木编号,如果该位置没有积木,输出空行
样例输入:
2 2
1 2
1 2
样例输出:
1 2
样例输入:
4 4
3 1
4 3
2 4
2 2
样例输出:
2 4 3 1
分析与解答:
开二维数组回爆内存,所以用动态数组vector。
每次转移之后要清掉被转移的vector的内存。
具体就是先初始化,然后根据操作转移,清空内存,最后输出即可。
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>using namespace std;int main(){int n,m;cin>>n>>m;vector<int> c[10011];for(int i=1;i<=n;++i){c[i].push_back(i);}for(int i=1;i<=m;++i){int a,b;cin>>a>>b;if(a==b) continue;else{for(int j=0;j<c[b].size();++j){c[a].push_back(c[b][j]);}vector<int>().swap(c[b]); } }for(int i=1;i<=n;++i){for(int j=0;j<c[i].size();++j){if(j!=c[i].size()-1) cout<<c[i][j]<<' ';else cout<<c[i][j];}cout<<endl;}
}