我不明白这个 bfs 算法代码

Posted

技术标签:

【中文标题】我不明白这个 bfs 算法代码【英文标题】:i do not understand this bfs algorithm code 【发布时间】:2015-12-19 12:42:10 【问题描述】:

我不明白这个 BFS 代码。我已经阅读了算法并理解了算法。我还解决了 BFS 算法的图形问题,但我无法理解这段代码。

#include <iostream>
#include <queue>
#include <utility>

//Infinity
#define INF 1000000

using namespace std;

int distances[4][4] = 
  0,INF,INF,INF,
  INF,INF,INF,INF,
  INF,INF,INF,INF,
  INF,INF,INF,INF,
;
/*S->start
E->end

S 0 0 0
|   
1-1-1-1
|   | |
1 0 1-E
|   | |
1-1-1-1*/


int matrix[4][4] = 
  1,0,0,0,
  1,1,1,1,
  1,0,1,1,
  1,1,1,1
;

void BFS()

  queue< pair<int,int> > queue;
  //Add the first node
  queue.push(make_pair(0,0));

  while(!queue.empty())
  
    //cout << "here" << '\n';
    pair<int,int> cur = queue.front();
    queue.pop();
    //Check adjacent nodes
    if(cur.first-1 > 0)
    
      if((distances[cur.first-1][cur.second] == INF) && (matrix[cur.first-1][cur.second] == 1))
      
        distances[cur.first-1][cur.second] = distances[cur.first][cur.second]+1;
        queue.push(make_pair(cur.first-1,cur.second));
      
    
    if(cur.first+1 < 4)
    
      if(distances[cur.first+1][cur.second] == INF && (matrix[cur.first+1][cur.second] == 1))
      
        distances[cur.first+1][cur.second] = distances[cur.first][cur.second]+1;
        queue.push(make_pair(cur.first+1,cur.second));
      
    
    if(cur.second-1 > 0)
    
      if((distances[cur.first][cur.second-1] == INF) && (matrix[cur.first][cur.second-1] == 1))
      
        distances[cur.first][cur.second-1] = distances[cur.first][cur.second]+1;
        queue.push(make_pair(cur.first,cur.second-1));
      
    
    if(cur.second+1 < 4)
    
      if((distances[cur.first][cur.second+1] == INF) && (matrix[cur.first][cur.second+1] == 1))
      
        distances[cur.first][cur.second+1] = distances[cur.first][cur.second]+1;
        queue.push(make_pair(cur.first,cur.second+1));
      
    
  




int main()

  BFS();
  for(int i = 0; i < 4; i++)
  
    for(int j = 0; j < 4; j++)


       
          if(distances[i][j] != INF)
            cout << distances[i][j] << ' ';
          else
            cout << "X" << ' ';
        
        cout << '\n';
      
 return 0;

我不明白什么是'cur.first-1'和'cur.second'

我也不明白 if 语句 '(cur.first+1

【问题讨论】:

你不明白什么? cur 在上面被引用的地方定义。没有什么特别复杂的事情发生。 Stack Overflow 无法从第一原理向您解释一切。 我不明白这个'对 cur = queue.front();'因为我主要使用 arduino ide,所以这对我来说是新的 我从未在 arduino ide 中看到过这种声明。 也许读过一些关于 C++ 的基础教程?即使您不了解类型,您也应该能够识别出它是一个变量声明。谷歌“C++ 对”和“C++ 队列”以了解 first、second、pop() 和 front() 的作用——或阅读一些基本数据结构(在进入算法之前大多数地方都会介绍) . 我并不是说这是刻薄的,顺便说一句,但 Stack Overflow 并没有(如您所见)很好地处理这类问题。这不是本网站的目的。 【参考方案1】:

你不明白的主要是std::pairhttp://www.cplusplus.com/reference/utility/pair/,它将两种类型(或两种相同类型)组合成由这两种类型组成的一个对象的类型。

还要注意using namespace std;,它程序员不用std::。出于多种原因,这是一种糟糕的风格,你不应该自己做,但应该理解别人做的时候。

所以std::pair&lt;int, int&gt; 是一种类型。该类型的对象由两个ints 组成,第一个名为first,第二个名为second。所以它是一个非常类似于的类型:

struct  int first; int second; ;

如果cur 是上述struct 的对象,我假设你会理解cur.firstcur.second 是什么,如果你知道cur.first 是什么,那么你就会知道cur.first-1 是什么是(没有神奇的意思,只是计算一个比cur.first的值小一的值

而且,是的,该代码正在寻找网格上两点之间的路径。

程序员选择将位置row,column表示为pair,有点偷懒。然后由于没有评论pair&lt;int,int&gt; 用于保存row,column 的事实而更加复杂

因此,所有这些 &gt;0&lt;4 检查都是测试当前 row,col 的特定邻居是否真的存在(而不是在地图边缘)的丑陋方法。

接下来你会想了解std::queue http://www.cplusplus.com/reference/queue/queue/

其中一个用于保存所有可到达的row,col 对,它们与0,0 的距离已计算,但与某个邻居的0,0 的距离可能尚未计算。所以基本操作是从队列的一端取其中之一;检查所有邻居;对于新发现距离的任何邻居,插入队列的另一端。

【讨论】:

以上是关于我不明白这个 bfs 算法代码的主要内容,如果未能解决你的问题,请参考以下文章

我不明白这个代码行是做啥的,$this->link->query($query)? [复制]

我有这个错误:无法读取 null 的属性“值”,我不明白为啥

我的 C++ 程序中的一些代码使程序崩溃。我正在实现 BFS 算法

熬夜怒肝,图解算法!BFS和DFS的直观解释

熬夜怒肝,图解算法!BFS和DFS的直观解释

BFS练习(附带hash算法)