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

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;
 }  
木块代码先留个坑
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值