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; // 没有路径 }
相关文章推荐
- C++设计模式浅识简单工厂模式
- c++ 创建用当前时间命名的文件夹
- c语言中包含math.h的时用gcc编译要加-lm参数
- c++ const总结
- VC++2008 如何使用Windows Media Player控件
- 【新手入门】C++中的一点问题
- C++文件上传、下载工具
- c++ linkage and storage
- c++ 的 坑真多之头文件
- windows10下编译clang流水帐
- nana初体验,菜单和可移动按钮
- C++ string 类中substr的使用方法
- C/C++中的成员函数指针声明及使用
- 数据额结构(C语言)调试过程中的一些问题
- 单链表C++实现
- 【C语言】哈希函数写法、字符串深度复制
- c++11 多线程间共享数据 <c++ concurrency in action>
- C:数组
- essential c++ 练习题(2)
- C++宏定义