黑白图像

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

【输入格式】
第1行输入一个正整数n(n≤700),此后输入n行,每行是由n个0或1组成的字符串。
【输出格式】
输出八连块的个数。
【样例输入】
6
100100
001010
000000
110000
111000
010100
【样例输出】
3
【分析】
BFS即可。

type
  rec=record
        x,y:longint;
    end;
const
  dx:array[1..8]of longint=(1,1,1,-1,-1,-1,0,0);
    dy:array[1..8]of longint=(1,0,-1,1,0,-1,1,-1);
var
  i,j,k,n,h,r,ans:longint;
    a:array[0..701,0..701]of boolean;
    q:array[0..50000]of rec;
    ch:char;
procedure bfs(i,j:longint);
begin
  h:=0;r:=1;
    q[1].x:=i;q[1].y:=j;
    a[i,j]:=false;
  while h<r do begin
      inc(h);
      for k:=1 to 8 do
        if a[q[h].x+dx[k],q[h].y+dy[k]] then begin
            inc(r);
            q[r].x:=q[h].x+dx[k];q[r].y:=q[h].y+dy[k];
            a[q[r].x,q[r].y]:=false;
        end;
  end;
end;
begin
  readln(n);
    for i:=1 to n do begin
      for j:=1 to n do begin
          read(ch);
            if ord(ch)>ord('0') then a[i,j]:=true else a[i,j]:=false;
        end;
        readln;
    end;
    ans:=0;
    for i:=1 to n do
      for j:=1 to n do
          if a[i,j] then begin
              inc(ans);
                bfs(i,j);
            end;
    write(ans);
end.
posted @ 2016-12-08 06:12  JRX2015U43  阅读(164)  评论(0编辑  收藏  举报