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