【题目描述】 输入一个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.转载于:https://www.cnblogs.com/JRX2015U43/p/6533477.html