数据结构:堆积木
题目要求:堆积木
输入样例1:
2 2
1 2
1 2
输出样例1:
1 2
输入样例2:
4 4
3 1
4 3
2 4
2 2
样例输出2
2 4 3 1
(两个换行)
//==================//
代码如下:
c++
简单的人的思维
// An highlighted block
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n, m;//n是有多少块积木,m是多少次操作;
int a, b;//把b放在a上面
vector<int>Block[10001];//像数组一样动态开辟好像行不通,并且会报错:(
vector<int>::iterator itr;
cin>>n>>m;
for (int i = 1; i <= n; i++)
{
Block[i].push_back(i);//每一个容器都存放一个对应的数字
}
for (int j = 1; j <= m; j++)
{
cin >> a >> b;//输入操作数
if (a == b)
continue;
if (!Block[b].empty())//当b元素不空时,每一个元素都迁移到Block[a]中
{
for (itr = Block[b].begin(); itr != Block[b].end(); itr++)
{
Block[a].push_back(*itr);
}
Block[b].clear();//迁移完毕就清空
vector<int>().swap(Block[b]);
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 0;j<Block[i].size(); j++)
{
if (Block[i].empty())
break;
if (j != 0)
cout << " ";
cout << Block[i][j];
}
cout << endl;
}
return 0;
}
由于测试数据中有一个10000的,所以定义10001。提交之后发现内存超限,后来查看提示是没有释放vector所占用的内存。
vector<int>().swap(Block[b]);//这句话就是用来释放内存的,题目标解里也有这句话,是我之前一直忽略了这个问题。
做的时候还遇到一个问题,就是iterator越界,这里注意end()函数返回的是最后一个元素的下一个,但问题并不出现在这里。当输入的操作数a==b的时候,其实是不需要移动的,而我忽略了这个重要信息。添加以下代码:
if (a == b)
continue;
这是我的第一篇文章 😃
请勿直接Copy,欢迎指正~