您的位置:首页 > 编程语言 > C语言/C++

vector类c++ && BFS

2016-05-15 16:27 671 查看

insert()

下面的插入和删除操作将发生元素的移动(为了保持连续存储的性质),所以之前的迭代器可能失效

single element (1):

iterator insert (const_iterator position, const value_type& val);//在position位置插入一个val拷贝


fill (2):

iterator insert (const_iterator position, size_type n, const value_type& val);// 注意迭代器可能不再有效(可能重新分配空间)


range (3):

template <class InputIterator>
iterator insert (const_iterator position, InputIterator first, InputIterator last);


move (4):

iterator insert (const_iterator position, value_type&& val);


initializer list (5):

iterator insert (const_iterator position, initializer_list<value_type> il);


erase()

erase():从指定容器删除指定位置的元素或某段范围内的元素

erase()方法有两种重载形式:

iterator erase(   iterator _Where);
1ist.iterator erase(   iterator _First,   iterator _Last);


如果是删除指定位置的元素时:

返回值是一个迭代器,指向删除元素下一个元素;如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素

未完待续^o^

Breadth-first Search(广度优先搜索)求解最短路径

可简单理解为二叉树的横向搜索,算法伪代码为:(队列数据结构实现)

将起点标记为已走过并已经入队
while(队列非空) {
出队一个点t;
if (t 是终点) break;
else 沿右、下、左、上四个方向搜索相邻的点
if (和t相邻的点有路可走,并且未走过) {
将相邻的点标记为已走过并入队,它的前趋就是
出队的t点;
}
}
if (t是终点) {
打印t点的坐标;
while (t点有前趋) {
p点 = p点的前趋;
打印t点的坐标;
}
} else 没有路线可以到达终点;


广度搜索最常用于迷宫,大牛等类型的题中,考察的是求解最短路径的算法,简单点说可将要解决的问题可以转化成在一个矩阵上,在这矩阵中找到一条最短路径。具体实现:确定一个点为起点,然后以这个起点向四个方向搜索,若无阻碍则把该点压入数组中,而数组的下标即为路径的长度(若用队列queue的话则要pop(),并标记已经搜索过的位置)



v[i]表示数组,打钩的地方是无法通过的地方,s是起点,E是终点,以起点为开始向四周搜索,直到搜索到终点结束,该图显示最短路径应该为5,可以看成是数的由根节点开始往下同层(level)搜索,这是广度搜索的大概过程(个人看法),如有不对的地方还请指正

int maze[MAX][MAX];
int move[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
struct node {
int x;
int y;
};


bool safe(int x, int y) {
if (x > 0 && y > 0 && x <= n && y <= m && maze[x][y] == 1) {
return true;
}
return false;
}


// 用vector实现的bfs搜索
vector<node> v[2 * MAX];
node nod;
nod.x = i;// 起点坐标为(i, j)
nod.y = j;
v[0].push_back(nod);
int k = 0;
int f = 0;
while (1) {
if (v[k].begin() == v[k].end()) {
break;
}
vector<node>::iterator itr;
for (itr = v[k].begin(); itr != v[k].end(); itr++) {
node fi = *itr;
for (int i = 0; i < 4; i++) {
node t;
t.x = fi.x+move[i][0];
t.y = fi.y+move[i][1];
if (t.x == x2 && t.y == y2) { // 终点坐标为(x2,y2)
f = 1;
break;
}
if (safe(t.x, t.y)) {
v[k+1].push_back(t);
maze[t.x][t.y] = 0;
}
}
}
k++;
if (f == 1) {
break;
}
}
if (f == 1) {
cout << k << endl;
} else {
cout << "-1" << endl; // 没有路径
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: