【CodeVS】1293-LMLPHP

【CodeVS】1293-LMLPHP

输入输出样例

【CodeVS】1293-LMLPHP

思路:看到题目我萌第一眼想到的肯定是求联通快对吧,但是这个联通快有点奇特,因为

这样他也算是一个联通快【CodeVS】1293-LMLPHP。解决此题其实有三种解法:1)宽搜(这个符合基本法);2)并查集;3)灌水法

但是蒟蒻写的是并查集

代码如下:

 var n,m,i,j,ans:longint;
     c:..,..]of char;
     pre:..]of longint;
     a:..]of boolean;
 function find(x:longint):longint;
 begin
  if pre[x]=x then exit(x);
  find:=find(pre[x]);
  pre[x]:=find;
 end;
 procedure join(x,y:longint);
 var fx,fy:longint;
 begin
  fx:=find(x);fy:=find(y);
  if fx<>fy then pre[fx]:=find(fy);
 end;
 begin
  readln(n,m);
   to n*m do pre[i]:=i;
   to n do
   begin
     to m do
     begin
      read(c[i,j]);
          )*m+j]:=true;
          )*m+j]:=false;
     end;
     readln;
   end;
    to n do
    begin
      to m do
      begin
       if c[i,j]='#' then
       begin
            ,j]=)*m+j);
            ]=)*m+j+,(i-)*m+j);
             ,j]=)*m+j,(i-)*m+j);
             ]=)*m+j+,(i-)*m+j);
             ,j-]=,(i-)*m+j);
             ,j+]=,(i-)*m+j);//其实不用12个点全部判一遍,因为有重复覆盖到的部分
       end;
      end;
    end;
    to n*m do if pre[i]=i then if a[i] then inc(ans);//统计“联通快”个数
  writeln(ans);
 end.

这是蒟蒻第一道一次AC的提,发个随笔纪念一下(^_^)

05-08 14:56