筆記——BFS
/*廣度優先算法(BFS)——列舉(基於圖的搜索)
對於
1->2->3->4->6->7
2->1->3-4->6
3->1->2
4->1->2
5->6
6->1->2->5
7->1
以1爲起點開始遍歷,
1 找到 2,3,4,6,7
2 找不到
3 找不到
4 找不到
6 找到 5
7 找不到
5 找不到
隊列的進出,先進先出
void bfs(int x){
queue<int>que;
que.push(x);
vis[x]=true;
while(!que.empty())
{
int top=que.front();
que.pop();
for(int i=1;i<=n;i++)
{
if(!vis[i]&&e[x][i])
{
que.push(i);
vis[i]=true;
}
}
}
return;
}
*/
/*
迷宮找最短通關距離時用BFS較好(個人認爲)
*/
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
#define MAXN 100
#define MAXM 100
typedef pair<int,int>P;
char G[MAXN][MAXM];
int D[MAXN][MAXM];
int n,m,sx,sy,ex,ey;
int d[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int BFS()
{
memset(D,0,sizeof(D));
queue<P>p;
p.push(P(sx,sy));
while(!p.empty())
{
P q=p.front();
p.pop();
G[q.first][q.second]='#';
for(int i=0;i<4;i++)
{
int dx=q.first+d[i][0];
int dy=q.second+d[i][1];
if(dx>=0&&dy>=0&&dx<n&&dy<m&&G[dx][dy]!='#')
{
if(G[dx][dy]=='.')
{
p.push(P(dx,dy));
D[dx][dy]=D[q.first][q.second]+1;
}
else
{
return D[q.first][q.second]+1;
}
}
}
}
return -1;
}
void findse()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(G[i][j]=='S')
{
sx=i,sy=j;
}
else if(G[i][j]=='G')
{
ex=i,ey=j;
}
}
}
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
for(int i=0;i<n;i++)
{
scanf("%s",G[i]);
}
findse();
//printf("%d %d %d %d\n",sx,sy,ex,ey);
printf("%d\n",BFS());
}
return 0;
}
/*
10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
22
*/
對於
1->2->3->4->6->7
2->1->3-4->6
3->1->2
4->1->2
5->6
6->1->2->5
7->1
以1爲起點開始遍歷,
1 找到 2,3,4,6,7
2 找不到
3 找不到
4 找不到
6 找到 5
7 找不到
5 找不到
隊列的進出,先進先出
void bfs(int x){
queue<int>que;
que.push(x);
vis[x]=true;
while(!que.empty())
{
int top=que.front();
que.pop();
for(int i=1;i<=n;i++)
{
if(!vis[i]&&e[x][i])
{
que.push(i);
vis[i]=true;
}
}
}
return;
}
*/
/*
迷宮找最短通關距離時用BFS較好(個人認爲)
*/
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <queue>
using namespace std;
#define MAXN 100
#define MAXM 100
typedef pair<int,int>P;
char G[MAXN][MAXM];
int D[MAXN][MAXM];
int n,m,sx,sy,ex,ey;
int d[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
int BFS()
{
memset(D,0,sizeof(D));
queue<P>p;
p.push(P(sx,sy));
while(!p.empty())
{
P q=p.front();
p.pop();
G[q.first][q.second]='#';
for(int i=0;i<4;i++)
{
int dx=q.first+d[i][0];
int dy=q.second+d[i][1];
if(dx>=0&&dy>=0&&dx<n&&dy<m&&G[dx][dy]!='#')
{
if(G[dx][dy]=='.')
{
p.push(P(dx,dy));
D[dx][dy]=D[q.first][q.second]+1;
}
else
{
return D[q.first][q.second]+1;
}
}
}
}
return -1;
}
void findse()
{
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(G[i][j]=='S')
{
sx=i,sy=j;
}
else if(G[i][j]=='G')
{
ex=i,ey=j;
}
}
}
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
for(int i=0;i<n;i++)
{
scanf("%s",G[i]);
}
findse();
//printf("%d %d %d %d\n",sx,sy,ex,ey);
printf("%d\n",BFS());
}
return 0;
}
/*
10 10
#S######.#
......#..#
.#.##.##.#
.#........
##.##.####
....#....#
.#######.#
....#.....
.####.###.
....#...G#
22
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.