我不明白这个 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 无法从第一原理向您解释一切。
我不明白这个'对你不明白的主要是std::pair
http://www.cplusplus.com/reference/utility/pair/,它将两种类型(或两种相同类型)组合成由这两种类型组成的一个对象的类型。
还要注意using namespace std;
,它让程序员不用std::
。出于多种原因,这是一种糟糕的风格,你不应该自己做,但应该理解别人做的时候。
所以std::pair<int, int>
是一种类型。该类型的对象由两个int
s 组成,第一个名为first
,第二个名为second
。所以它是一个非常类似于的类型:
struct int first; int second; ;
如果cur
是上述struct
的对象,我假设你会理解cur.first
和cur.second
是什么,如果你知道cur.first
是什么,那么你就会知道cur.first-1
是什么是(没有神奇的意思,只是计算一个比cur.first
的值小一的值
而且,是的,该代码正在寻找网格上两点之间的路径。
程序员选择将位置row,column
表示为pair
,有点偷懒。然后由于没有评论pair<int,int>
用于保存row,column
的事实而更加复杂
因此,所有这些 >0
和 <4
检查都是测试当前 row,col
的特定邻居是否真的存在(而不是在地图边缘)的丑陋方法。
接下来你会想了解std::queue
http://www.cplusplus.com/reference/queue/queue/
其中一个用于保存所有可到达的row,col
对,它们与0,0
的距离已计算,但与某个邻居的0,0
的距离可能尚未计算。所以基本操作是从队列的一端取其中之一;检查所有邻居;对于新发现距离的任何邻居,插入队列的另一端。
【讨论】:
以上是关于我不明白这个 bfs 算法代码的主要内容,如果未能解决你的问题,请参考以下文章
我不明白这个代码行是做啥的,$this->link->query($query)? [复制]
我有这个错误:无法读取 null 的属性“值”,我不明白为啥