黑白图像
【题目描述】
输入一个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.