BFS例题

例题1:

在这里插入图片描述

AC代码:

#include <stdio.h>
#define max 100
typedef struct
{
    int x;
    int y;
}Node;

int X[]={0,1,0,-1};
int Y[]={1,0,-1,0};// 用于指明相邻点的坐标
int m,n;//matrix为m*n型
int G[max][max];//定义矩阵
int visited[max][max]={0};//判断该点(x,y)是否已经被访问,初始化为全0,即未被访问


int judge(int x,int y)//判断(x,y)点是否需要访问
{
    if(x<0||x>=m||y<0||y>=n)return 0;//越界,无需访问
    if(G[x][y]==0||visited[x][y])return 0;//如果该点值为0或者该点已经被访问过,无需再次访问
    return 1;//其他情况返回1
}

void BFS(int x,int y)//对(x,y)周围的1进行"感染"
{
    Node Q[max];
    int front=-1,rear=-1;//初始化队列
    Node temp;
    Q[++rear].x=x;
    Q[rear].y=y;//入队
    visited[x][y]=1;//访问位置为1
    while(front<rear)
    {
        temp=Q[++front];
        for(int i=0;i<4;i++)
        {
            int newx=temp.x+X[i];
            int newy=temp.y+Y[i];
            if(judge(newx,newy))
            {//如果需要感染
                Q[++rear].x=newx;
                Q[rear].y=newy;
                visited[newx][newy]=1;//和28~30行代码类似
            }
        }
    }

}


int main()
{
    freopen("input.txt","r",stdin);
    scanf("%d %d",&m,&n);//m*n型矩阵
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            scanf("%d",&G[i][j]);
        }
    }//读入矩阵
    int ans=0;
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(G[i][j]==1&&visited[i][j]==0)
            {
                ans++;
                BFS(i,j);
            }
        }
    }
    printf("%d ",ans);
}




例题2:

在这里插入图片描述
在这里插入图片描述

思路:

求最小步数,考虑BFS,因为BFS是按层数大小进行遍历的,第一次遇到满足终点坐标条件的结点,一定包含最短步数.

输入样例:

5 5
.....
.*.*.
.*S*.
.***.
...T*
2 2 4 3

输出:

11

AC代码:

#include <stdio.h>
#define max 100
typedef struct
{
    int x;
    int y;
    int step;
}Node;

int X[]={0,1,0,-1};
int Y[]={1,0,-1,0};// 用于指明相邻点的坐标
int m,n;//matrix为m*n型
char G[max][max];//定义矩阵
int visited[max][max]={0};//判断该点(x,y)是否已经被访问,初始化为全0,即未被访问
int Tx,Ty;//目的地坐标
int Sx,Sy;//源点坐标


int judge(int x,int y)//判断(x,y)点是否需要访问
{
    if(x<0||x>=m||y<0||y>=n)return 0;//越界,无需访问
    if(G[x][y]=='*'||visited[x][y]==1)return 0;//如果该点为‘墙’或者该点已经被访问过,无需再次访问
    return 1;//其他情况返回1
}

void BFS(int x,int y)//(x,y)为起点
{
    Node Q[max];
    int front=-1,rear=-1;//初始化队列
    Node temp;
    Q[++rear].x=x;
    Q[rear].y=y;
    Q[rear].step=0;//初始化起点
    visited[x][y]=1;//访问位置为1
    while(front<rear)
    {
        temp=Q[++front];
        if(temp.x==Tx&&temp.y==Ty){//每次出队列判断是否满足终点坐标
            printf("%d",temp.step);//第一个发现成立的点距离必定最短,因为BFS按层遍历
            return;
        }
        for(int i=0;i<4;i++)
        {
            int newx=temp.x+X[i];
            int newy=temp.y+Y[i];
            if(judge(newx,newy))
            {//如果可以走
                Q[++rear].x=newx;
                Q[rear].y=newy;
                Q[rear].step=temp.step+1;
                visited[newx][newy]=1;
            }
        }
    }
    printf("-1");//没有路径
}


int main()
{
    freopen("input.txt","r",stdin);
    scanf("%d %d",&m,&n);//m*n型矩阵
    for(int i=0;i<m;i++)
    {
        getchar();//吸收换行符
        for(int j=0;j<n;j++)
        {
            scanf("%c",&G[i][j]);
        }
        G[i][n]='\0';
    }//读入矩阵
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            printf("%c",G[i][j]);
        }
        printf("\n");
    }//读入矩阵
    scanf("%d %d",&Sx,&Sy);//读入源点坐标
    scanf("%d %d",&Tx,&Ty);//读入终点坐标
    BFS(Sx,Sy);
}




发布了54 篇原创文章 · 获赞 1 · 访问量 490

猜你喜欢

转载自blog.csdn.net/weixin_43370733/article/details/103971417
今日推荐