筆記——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
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章