广度优先搜索算法2

还是昨天的代码:
//广度优先搜索算法
int a[110][110]; //棋盘最大范围
int p[10010][4]; //路径二维数组
int n,m; //棋盘长和宽
int head=1; //记录路径二维数组中的头结点
int tail=1; //同上,尾结点
int dx[5]={0,0,1,0,-1}; //方向数组
int dy[5]={0,1,0,-1,0}; //同上
int tx,ty; //用于记录方向
int k=1; //用于记录第几个节点

void print(int x) //用于递归输出路径
{
if(p[x][3]!=0)
{
print(p[x][3]);
}
cout<<"("<<p[x][1]<<","<<p[x][2]<<")";
}
int main()
{
cin>>n>>m;
a[1][1]=1; //初始化棋盘起始位置
p[1][1]=1; //下三行为初始化路径二维数组
p[1][2]=1;
p[1][3]=0;
while(head<=tail) //利用路径二维数组来进行记录循环的次数
{
for(int i=1;i<=4;i++)
{
tx=p[head][1]+dx[i]; //用于寻找下一个可以走的节点
ty=p[head][2]+dy[i];
if(tx>=1&&tx<=n&&ty>=1&&ty<=m&&a[tx][ty]0) //节点可以走满足的条件
{
tail++; //在路径二维数组尾部添加节点
p[tail][1]=tx; //记录节点位置信息
p[tail][2]=ty; //同上
p[tail][3]=head; //记录连接该节点的上一个节点在路径二维数组中的位置信息
a[tx][ty]=k+1; //将棋盘已经走过的节点进行编辑
k++; //记录走的步数
if(tx
n&&ty==m)
{
print(tail); //到达棋盘终点时打印最短路径
}
}
}
head++; //每当一个位置的所有相邻节点全部搜索过后,将头结点位置从路径二维数组中往下移一位
}
cout<<endl;
system("pause");
return 0;
}

进行逐字逐句翻译之后:
1.中心思想:
从第一个节点开始,寻找与其相邻的节点,找完时候按照上一个节点找相邻节点的顺序依次往下寻找,直到找完上一个节点的所有相邻节点,然后再找所有子节点的相邻节点,依此类推
2.这种思想的难点在于如何将寻找节点的顺序和节点的连接情况搞清楚,在上述代码中使用的解决方法是使用路径二维数组,三列:
第一列是节点所在横坐标
第二列是节点所在纵坐标
第三列是节点所连接的上一个节点的编号
这样就完美解决了上述的两个难点问题
3.对于输出最简单的节点:
递归输出最后一个节点,从最后一个节点中的第三列寻找上一个节点的位置,依此类推,找到起始节点为止
4.为什么找到最后一个节点后顺序输出就是最短路径:
可以将其理解为一个树形结构:
根就是起始节点,在第一层
根的子结点就是第二层
子节点的子节点就是第三层
...
也就是说,每新接入一个节点都是在所有情况中最优的解,这样找到目标节点时直接输出就是最后的结果,有点贪心的思想在里面了

OK,结束了

posted @ 2025-08-06 21:15  暗神酱  阅读(15)  评论(0)    收藏  举报