输入输出样例
思路:看到题目我萌第一眼想到的肯定是求联通快对吧,但是这个联通快有点奇特,因为
这样他也算是一个联通快。解决此题其实有三种解法: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的提,发个随笔纪念一下(^_^)