广搜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;
} 

 

posted on 2018-11-26 17:56  lcdxjsj  阅读(105)  评论(0)    收藏  举报

导航