杭电 1241题

//题目大意:求相连的块数
//解题思路:使用广度优先搜索,搜索的次数即相连的块数
#include <iostream>
using namespace std;
#define arraysize 101
int dir[8][2] = {{1,0},{-1,0},{0,1},{0,-1},{1,1},{1,-1},{-1,1},{-1,-1}}; //定义搜索的8个方向
typedef struct node
{
 int x;
 int y;
}node;
char map[arraysize][arraysize];  //记录搜索时的地图
int m,n;
node myqueue[arraysize*arraysize]; //搜索时的队列
void BFS(int i,int j)
{
 int k;
 int start = 0;
 int top = 1;
 myqueue[0].x = i;
 myqueue[0].y = j;
 map[i][j] = '*';
 while(top!=start)
 {
  node frontnode = myqueue[start];
  int sx,sy;
  sx = frontnode.x;
  sy = frontnode.y;
  start++;
  for(k=0;k<8;++k)
  {
   int temptx = sx+dir[k][0];
   int tempty = sy+dir[k][1];
   if(temptx>=0 && temptx <m && tempty>=0 && tempty <n && map[temptx][tempty]=='@')
   {
    myqueue[top].x = temptx;
    myqueue[top].y = tempty;
    map[temptx][tempty] = '*';  //此处进行修改
    top++;
   }
  }
 }
}
int main()
{
 //freopen("1.txt","r",stdin);
 int i,j;
 while(cin>>m>>n)
 {
  if(m==0)
   break;
  for(i=0;i<m;++i)
  {
   for(j=0;j<n;++j)
   {
    cin>>map[i][j];
   }
  }
  int count = 0;
  for(i=0;i<m;++i)
  {
   for(j=0;j<n;++j)
   {
    if(map[i][j] == '@')
    {
     BFS(i,j);
     count++; //广度搜索的次数即相连的块数
    }
   }
  }
  printf("%d\n",count);
 }
 return 0;
}

你可能感兴趣的:(杭电)