【算法笔记】bfs广度优先搜索

1.对广度优先搜索的理解:

广度优先搜索相对于深度优先搜索,深度优先搜索就是从一个状态出发往深处走然后回退的过程,不断去枚举每一个方案,所以是“深度优先”;而对于广度优先搜索而言,没扩展万一个点都会以这个点进行再一次的扩展,所以是“宽度优先”。
2.一道模板题:bfs求最短路(不是图论)

求点S到点T的最短路

q[++tail]=S;//第一个点入队访问
vis[S]=1;//标记已被
dis[S]=0;//记录路径
while (head<=tail)//表示队列不为空
{
  int x=[q++head];//取队头,并出列
  for(int i=1li<=n;i++)//枚举每一个点
  if (adj[x][i]&&!vis[i])//如果连同并且没有访问过
  {
    q[++tail]=i;//新状态如队
    vis[i]=i;//标记
    dis[i]=dis[x]+1;记录路径
    if (i==T)
        cout<

3.骑士救公主

其实到公主的最小耗费,每一格都有一个单位时间,杀死守卫要多一个单位时间

这道题目表较复杂,队列q需要用三个数组,qx记录骑士行,qy记录骑士列,qs记录该店有无守卫的情况,dis[x][y][z]纪录路径,xy分别表示行列,z表示有无守卫的情况,其余bfs过程大致相同

4.矩阵编码

题目如图:

【算法笔记】bfs广度优先搜索_第1张图片【算法笔记】bfs广度优先搜索_第2张图片

这道题也只要按照题意模拟,套bfs模板即可,便见是要看代码如何实现

#include
using namespace std;
int qax[360000],qay[360000],L[360000],T,n,head,tail,a[600][600];
void bfs()
{
	qax[head]=qay[head]=1;//表示第一个搜索的点的左上角的坐标,qax表示左上角的行,qay表示左上角的列
        L[head]=n;//表示矩阵的长度
	while (head<=tail)
	{
		int s0=0,s1=0;
		for (int i=qax[head];i<=qax[head]+L[head]-1;i++)
		    for (int j=qay[head];j<=qay[head]+L[head]-1;j++)
		        if (a[i][j]==1) s1++;个数
		            else s0++;//求0和1的
		if (s0==0)//如果全1
		{
			printf("01");
			head++;
		}
		if (s1==0)//如果全0
		{
			printf("00");
			head++;
		}
		if (s0>0&&s1>0)//有1也有0
		{
			printf("1");
			qax[++tail]=qax[head];
			qay[tail]=qay[head];
                        L[tail]=L[head]/2;//第一个左上角
			qax[++tail]=qax[head];
			qay[tail]=qay[head]+L[head]/2;
			L[tail]=L[head]/2;//第二个左上角
			qax[++tail]=qax[head]+L[head]/2;
			qay[tail]=qay[head];
			L[tail]=L[head]/2;//第三个左上角
			qax[++tail]=qax[head]+L[head]/2;
			qay[tail]=qay[head]+L[head]/2;
			L[tail]=L[head]/2;//第四个左上角
			head++;
		}
	}
	return;
}
int main()
{
	freopen("coding.in","r",stdin);
	freopen("coding.out","w",stdout);
	scanf("%d",&T);
	for (int t=1;t<=T;t++)
	{
		memset(a,0,sizeof(a));
		memset(qax,0,sizeof(qax));
		memset(qay,0,sizeof(qay));
		memset(L,0,sizeof(L));//初始化
		cin>>n;
		for (int i=1;i<=n;i++)
		    for (int j=1;j<=n;j++)
		        scanf("%d",&a[i][j]);//读入
		head=1,tail=1;//队列初始化
		bfs();//进行搜索
		printf("\n");
	}	
	fclose(stdin);
        fclose(stdout);
	return 0;
}




你可能感兴趣的:(【算法笔记】bfs广度优先搜索)