广搜专题-1001

来源:互联网 发布:方正畅听软件 编辑:程序博客网 时间:2024/04/28 05:19

                                    1001

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte
总提交: 23            测试通过: 7

描述

输入一个n*n的黑白图像(1表示黑色,0表示白色),任务是统计其中八连块的个数。如果两个黑格子有公共边或者公共顶点,就说它们属于同一个八连块。如图所示的图形有3个八连块。

输入

第1行输入一个正整数n(n≤700),此后输入n行,每行是由n个0或1组成的字符串。

输出

在输入黑白图像中,八连块的个数

样例输入

6100100001010000000110000111000010100

样例输出

3

这题乍一看深搜,可是用深搜提示的是RE,不知为什么 ?

  深搜不行就广搜吧;

代码:

#include<cstdio>#include<cstring>#include<queue>using namespace std;char maze[701][701];int dir[][2]={{-1,0},{-1,1},{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1}};int N;struct Point{int x,y;};void bfs(int i,int j){    queue<Point> p;Point q,t;    q.x=i;q.y=j;p.push(q);while(!p.empty()){  q=p.front();  p.pop();  for(int k=0;k<8;k++)  {  t.x=q.x+dir[k][0];  t.y=q.y+dir[k][1];     if(t.x>=0&&t.x<N&&t.y>=0&&t.y<N&&maze[t.x][t.y]=='1') {    maze[t.x][t.y]='0';p.push(t);  }   }}}int main(){while(~scanf("%d",&N)&&N){int ans=0;for(int i=0;i<N;i++) scanf("%s",maze[i]);    for(int i=0;i<N;i++)    {    for(int j=0;j<N;j++)     {      if(maze[i][j]=='1')  {     ans++; bfs(i,j);    }      }    }    printf("%d\n",ans);}}

0 0