c++佚名者学校根据c++编程开了很多课程。
这是一个阳光明媚的日子。清风轻抚大地,划过河岸,嬉戏在柳树间。小航离开宿舍,在春光的沐浴中走向“算法教室”。
算法课由XC老师开展教授。“叮——叮——”上课铃响了,GDN老师走入教室,“废话不说,上课!”
第一部分:认识BFS
“同学们对基础算法之一——DFS掌握的还挺好的,今天我们就学习BFS,就是宽度优先搜索!请同学们认真听课!”GDN老师扫视着同学们。
“BFS属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。”GDN老师看着认真认真听讲的同学们,“通过你们现在看到的程序,我们可以认识到它的搜索流程”
“好了,话说‘时间是验证真理的一个重要环节’(我瞎编的),我们现在就来做题吧!请看题”
第二部分:做题
include<cstdio>
using namespace std;
int n,m,a[15][15],b[15][15],de[1005][2],i,j=1,k;
int main()
{
freopen("area.in","r",stdin);
freopen("area.out","w",stdout);
for(int ii=1;ii<=10;ii++)
for(int jj=1;jj<=10;jj++)
{
scanf("%d",
if(a[ii][jj]==1)
k++;
}
if(k==0)
{
printf("100");
return 0;
}
de[1][1]=0;
de[1][2]=0;
b[0][0]=1;
a[0][0]=1;
k=0;
while(i<j)
{
i++;
for(int i1=-1;i1<=1;i1++)
{
if(i1==0)
continue;
if(de[i][1]+i1>=0&&de[i][1]+i1<=11&&a[de[i][1]+i1][de[i][2]]==0&&b[de[i][1]+i1][de[i][2]]==0)
{
j++;
de[j][1]=de[i][1]+i1;
de[j][2]=de[i][2];
a[de[j][1]][de[j][2]]=1;
b[de[j][1]][de[j][2]]=1;
}
}
for(int i1=-1;i1<=1;i1++)
{
if(i1==0)
continue;
if(de[i][2]+i1>=0&&de[i][2]+i1<=11&&a[de[i][1]][de[i][2]+i1]==0&&b[de[i][1]][de[i][2]+i1]==0)
{
j++;
de[j][1]=de[i][1];
de[j][2]=de[i][2]+i1;
a[de[j][1]][de[j][2]]=1;
b[de[j][1]][de[j][2]]=1;
}
}
}
for(int i1=1;i1<=10;i1++)
{
for(int j1=1;j1<=10;j1++)
{
if(a[i1][j1]==0)
k++;
}
}
printf("%d",k);
fclose(stdin);
fclose(stdout);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
struct zuobiao
{
int x,y;
};
queue<zuobiao>q;
zuobiao c;
int sum,n,m,fang[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
char ma[105][105];
int visit[105][105];
void bfs(int x,int y)
{
sum++;
c.x=x;
c.y=y;
q.push(c);
visit[c.x][c.y]=1;
while(!q.empty())
{
zuobiao t=q.front(),ne;
q.pop();
for(int i=0;i<4;i++)
{
ne.x=t.x+fang[i][0];
ne.y=t.y+fang[i][1];
if(ne.x<=n&&ne.x>=1&&ne.y<=m&&ne.y>=1&&ma[ne.x][ne.y]!='0'&&visit[ne.x][ne.y]==0)
{
q.push(ne);
visit[ne.x][ne.y]=1;
}
}
}
}
int main()
{
freopen("cell.in","r",stdin);
freopen("cell.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>ma[i][j];
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(visit[i][j]==0&&ma[i][j]!='0')
{
bfs(i,j);
}
}
}
cout<<sum;
fclose(stdin);
fclose(stdout);
}
第三部分:总结
“触及算法的问题没有具体的做法,需要慢慢摸索、探求规律、多练多做,才能真正掌握!”GDN老师一脸严肃地望着同学们……