BFS入门
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define MAX 100
#define INF 0x3f3f3f3f
typedef pair<int ,int> P;
int sx,sy,gx,gy,n,m;
char maze[MAX][MAX];
int d[MAX][MAX];
int diraction[][]={{,},{,},{-,},{,-}};
P ser[MAX][MAX];
int bfs()
{
cin>>n>>m;
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{ cin>>maze[i][j];
if(maze[i][j]=='S')
{
sx=i;
sy=j;
}
if(maze[i][j]=='G')
{
gx=i;
gy=j;
}
}
queue<P> que;
que.push(P(sx,sy));
memset(d,INF,sizeof(d));
d[sx][sy]=;
while(que.size())
{
P p=que.front();
que.pop();
int x=p.first,y=p.second;
if(x==gx&&y==gy) break;
for(int i=;i<;i++)
{
int cx=x+diraction[i][],cy=y+diraction[i][];
if(cx>=&&cx<n&cy>=&&cy<m&&d[cx][cy]==INF&&maze[cx][cy]!='#')
{
que.push(P(cx,cy));
d[cx][cy]=d[x][y]+;
ser[cx][cy].first=x;
ser[cx][cy].second=y;
}
}
}
return d[gx][gy];
}
void print(int x,int y)
{
if(x==sx&&y==sy)
{
cout<<'('<<sx<<','<<sy<<')'<<endl;
return ;
}
print(ser[x][y].first,ser[x][y].second);
cout<<'('<<x<<','<<y<<')'<<endl;
return ;
}
int main ()
{
cout<<bfs()<<endl;
print(gx,gy);
return ;
}
樣例:
N=10, M=10(迷宮如下圖所示。'#','.','S','G'分別表示墻壁、通道、起點(diǎn)和終點(diǎn))
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
輸出
22(附加坐標(biāo))
解析 : 廣度優(yōu)先搜索對(duì)樹的每一層一次遍歷,即篩選最短路徑,用隊(duì)列存儲(chǔ)找到的元素(相對(duì)于深度優(yōu)先搜索使用棧),其中可用pair類替換結(jié)構(gòu)體;對(duì)于打印路徑,因?yàn)槊總€(gè)節(jié)點(diǎn)的孩子只有一個(gè)雙親所以可以用孩子記錄雙親依此找到最短路徑坐標(biāo),對(duì)于非遞歸輸出可用棧存儲(chǔ)。
總結(jié)
- 上一篇: 可定制盒装亮片颗粒自动称重多头分装机厂家
- 下一篇: IMS面板CFL-000001-RX