C++ 我不理解这个bfs算法代码

C++ 我不理解这个bfs算法代码,c++,algorithm,tree,C++,Algorithm,Tree,我不理解这个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}, {

我不理解这个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<4的条件以及使用它们的语句背后的逻辑。这是为查找网格中两点之间的路径而编写的代码。

您不了解的主要内容是std::pair,它将两种或两种相同类型的对象组合为一种由这两种类型构成的对象类型

还要注意使用名称空间std;这样程序员就可以省去std::。这是一种糟糕的风格,原因很多,你不应该自己做,但应该理解别人做了什么

所以std::pair是一种类型。该类型的对象由两个int组成,第一个int命名为first,第二个int命名为second。因此,这是一种非常类似于:

struct { int first; int second; };
如果cur是上述类型结构的对象,我假设你会理解cur.first和cur.second,如果你知道cur.first是什么,那么你就会知道cur.first-1不是什么神奇的意思,只是计算一个小于cur.first的值

是的,代码是在网格上的两点之间寻找路径

程序员选择将位置{row,column}表示为一对,这有点懒惰。然后,由于未能对该对用于保存{row,column}这一事实进行注释,这使得情况更加复杂


所有这些>0,还有什么你不明白的?cur在上面的引用位置定义。没有什么特别复杂的事情发生。堆栈溢出不能从第一原理向您解释一切。我不理解这个“pair cur=queue.front;”因为我主要是和ARDUINO IDE一起工作,所以这是我在阿杜诺IDE中从未见过这种声明。也许在C++上阅读了一些基本教程?您应该能够识别它是一个变量声明,即使您不理解类型。谷歌C++对和C++队列,了解第一、第二、POP和前端做的事情,或者在基本算法结构上读一点,这是大多数地方在算法之前都会覆盖的。我不是说这是很卑鄙的,顺便说一下,但是堆栈溢出并不能像你们看到的那样处理好这些问题。这不是这个网站的目的。