广搜02【P1451】求细胞数量——第五版305页例题8.2
本题作为搜索(BFS)典型题,利用 2维数组存储数据和标记数组存储。
do__while( ) 循环阐述了经典的队列广搜应用。
放上代码:
#include<iostream> #include<cstdio> using namespace std; int dx[4]={-1,0,1,0}; int dy[4]={0,1,0,-1}; int bz[100][100],num=0,n,m; void doit(int p,int q) { int x,y,t,w,i; int h[1000][2]; num++; bz[p][q]=0;//标记用过的 t=0;w=1; //t-队头;w队尾 h[1][1]=p; //队列初始化 h[1][2]=q; // 让第一个先进队列 do { t++; //队头增加出队准备 for(i=0;i<=3;i++) { x=h[t][1]+dx[i]; y=h[t][2]+dy[i]; if((x>=0)&&(x<m)&&(y>=0)&&(y<n)&&(bz[x][y])) { w++; //队尾增加准备下次入队 h[w][1]=x; h[w][2]=y; bz[x][y]=0; } } }while(t<w); } int main() { //增加freopen() 便于本地数据输入测试 //freopen("in.txt","r",stdin); //freopen("out.txt","w",stdout); int i,j; char s[10000]; scanf("%d%d\n",&m,&n); for(i=0;i<m;i++) for(j=0;j<n;j++) bz[i][j]=1; for(i=0;i<m;i++) { //按照行读入 gets(s); for(j=0;j<n;j++) //是'0'的标记为0,其它的是1~9数字。 if(s[j]=='0') bz[i][j]=0; } for(i=0;i<m;i++)//广搜开始,非0的被调用到搜索。 for(j=0;j<n;j++) if(bz[i][j]) doit(i,j); cout<<num; return 0; }
浙公网安备 33010602011771号