您的位置:首页 > 其它

vector初始化,resize(),紫皮书木块问题

2020-04-02 18:36 986 查看

vector初始化,resize(),紫皮书木块问题。

如何利用vector构造杨辉三角

class Solution {
public:
vector<vector<int>> generate(int numRows) {
vector<vector<int>> ret(numRows);(给定一个)
for(int i=0;i<numRows;i++)
{
ret[i]=vector<int>(i+1,0);
ret[i][0]=1;
ret[i][i]=1;
}
if(numRows==2)return ret;
for(int i=1;i<numRows;i++)
for (int j = 1; j < ret[i].size()-1; ++j)
ret[i][j]=ret[i-1][j-1]+ret[i-1][j];
return ret;
}
};

这里总结一些vector的用法

vector<int>::iterator t;for(t=vec.begin();t!=vec.end();t++) cout<<*t<<endl;                  使用迭代器遍例
vector(int nSize) 	            创建一个vector,元素个数为nSize
vector(int nSize,const t& t)  	创建一个vector,元素个数为nSize,                                  且值均为t
vector(const vector&)      	复制构造函数
vector(begin,end)复制[begin,end)区间内另一个数组的元素到vector中

例子

vector<int>v1(3);//[0,0,0]
vector<int>v2(3,2);//[2,2,2]
vector<int>v3(v2);//[2,2,2]
int arr[]={1,2,3,4,5};
vector<int>v4(arr,arr+3);//[1,2,3]
vector<int>v1(3);//[0,0,0]
v1.push_back(2);//[0,0,0,2]
v1.insert(v1.begin()+2,5);//[0,0,5,0,2]
v1.insert(v1.begin()+2,3,1);//[0,0,1,1,1,5,0,2]
v1.insert(v1.begin()+2,v1.begin()+1,v1.end()-2);//[0,0,0,1,1,1,5,1,1,1,5,0,2]
int arr[]={1,2,3,4,5};
vector<int>v1(arr,arr+5);//[1,2,3,4,5]
v1.erase(v1.begin()+1);//[1,3,4,5]
v1.erase(v1.begin(),v1.end()-2);//[4,5]
v1.clear();//[]

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

const int maxn = 30;
int n;
vector<int> pile[maxn];									//因为木块的长度不定,所以适合用vector保存

//找木块的pile和height,以引用的形式返回(配合void)
void find_block(int a, int& p, int& h) {
for(p = 0; p < n; p++)
for(h = 0; h < pile[p].size(); h++)
if(pile[p][h] == a) return;					//要有自信好吧!这个复杂度也是o(n3)
}

//把第p堆高度为h的木块上方的所有木块移回原位。
void clear_above(int p, int h) {						//p代表行,h代表列
for(int i = h+1; i < pile[p].size(); i++) {
int b = pile[p][i];
pile[b].push_back(b);
}
pile[p].resize(h+1);								//pile只应保留下标0~h的元素,采用这种方法,就不需要用pop一个一个弹出了。
}

//把第p堆高度为h及其上方的木块整体移动到p2堆的顶部
void pile_onto(int p, int h, int p2) {
for(int i = h; i < pile[p].size(); i++) 			//从块1所在行往上截取,
pile[p2].push_back(pile[p][i]);					//从块2所在列往上堆填
pile[p].resize(h);
}

//调试神奇print()重出江湖
void print() {
for(int i = 0; i < n; i++) {
printf("%d:", i);
for(int j = 0; j < pile[i].size(); j++) print(" %d", pile[i][j]);
printf("\n");
}
}

int main()
{
int a, b;
cin >> n;
string s1, s2;
for(int i = 0; i < n; i++) pile[i].push_back(i);	//压入,数据等于下角标
while(cin >> s1 >> a >> s2 >> b) {
int pa, pb, ha, hb;
find_block(a, pa, ha); 							//a是待移动木块角标,pa是所在行,ha是所在列
find_block(b, pb, hb);							//b是最终位置角标,pb是所在行 , hb是所在列
if(pa = pb) continue;							//若所在行相同,则为无效移动
if(s2 == "onto") clear_above(pb, hb);
if(s1 == "move") clear_above(pa, ha);
pile_onto(pa, ha, pb);
}

return 0;
}
木块代码先留个坑
  • 点赞
  • 收藏
  • 分享
  • 文章举报
mrgaohaihang 发布了23 篇原创文章 · 获赞 1 · 访问量 512 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: