BFS(广搜) 细胞问题

SSL 2324
洛谷 P1451 求细胞数量
题目描述
一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如:阵列
0234500067
1034560500
2045600671
0000000089
有4个细胞。
P.S. 有人看不懂,其实就是并在一起的方阵算一个细胞。

题目分析
和找石油差不多的题目,不过用的是广搜。
首先,读入时可以将非零数标记为True。
然后用两重循环,每次找到为True的就进入BFS并增加细胞数量。
BFS在这里的作用,将整个细胞标记为False,然后在接下来的循环中就不会再找这个细胞了。

const
  dx:array[1..4]of longint=(1,-1,0,0);
  dy:array[1..4]of longint=(0,0,1,-1);
var
  n,m,x,y:longint;
  a:array[1..100,1..100]of boolean;
  f:array[1..10000]of longint;
  s:array[1..10000,1..2]of longint;

procedure init;
var
  i,j:longint;
  c:char;
begin
  readln(m,n);
  for i:=1 to m do
   begin
     for j:=1 to n do
      begin
        read(c);
        if c<>'0' then a[i,j]:=true
         else a[i,j]:=false;
      end;
     readln;
   end;
end;

function ping(x,y:longint):boolean;
begin
  if (not (x in[1..m]))or(not(y in[1..n])) then exit(false);
  if not a[x,y] then exit(false);
  exit(true);
end;

procedure bfs;
var
  h,t,i:longint;
begin
  h:=0;t:=1;
  s[1,1]:=x;s[1,2]:=y;
  repeat
   inc(h);
   for i:=1 to 4 do
    if ping(s[h,1]+dx[i],s[h,2]+dy[i]) then
     begin
       inc(t);
       f[t]:=h;
       s[t,1]:=s[h,1]+dx[i];
       s[t,2]:=s[h,2]+dy[i];
       a[s[t,1],s[t,2]]:=false;
     end;
  until h=t;
end;

procedure main;
var
  s:longint;
begin
  s:=0;
  for x:=1 to m do
   for y:=1 to n do
    if a[x,y] then begin inc(s);bfs; end;
  writeln(s);
end;

begin
  init;
  main;
end.
    原文作者:BFS
    原文地址: https://blog.csdn.net/SSL_QYH0Ice/article/details/53786862
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞