vector类c++ && BFS

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; // 没有路径
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值