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);
}




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值