【普及组模拟赛】家族
生活随笔
收集整理的這篇文章主要介紹了
【普及组模拟赛】家族
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
在一個與世隔絕的島嶼上,有一個有趣的現象:同一個家族的人家總是相鄰的(這里的相鄰是指東南西北四個方向),不同的家族之間總會有河流或是山丘隔絕,但同一個家族的人不一定有相同姓氏。現在給你島上的地圖,求出島上有多少個不同的家族。島上的地圖有n 行,每行有若干列,每個格子中要么是’空格表示大海,要么是‘ *’,表示河流或山丘,要么是小寫字母,表示一戶人家的姓氏。
輸入
第一行是個數字 N,表示下面信息的行數,接下來是 N 行字符,每行由小寫字母和*號組成,有些行的最前面也可能包含若干連續的空格,表示這些區域是大海,每一行最多不超過 200 個字符。
輸出
一個數字,表示家族數。
樣例輸入
4
*zlw**pxh
l*zlwk*hx*
w*tyy**yyy
zzl
樣例輸出
3
數據范圍限制
【數據范圍】
10%的數據, n<=1
30%的數據, n<=10
100% 的數據, n<=100 每一行最多不超過 200 個字符
分析
這題其實就是細胞問題
遇到一個沒有遍歷過的點就從它開始搜,每搜一次,tj+1。
程序:
const dx:array[1..4]of longint=(1,-1,0,0); dy:array[1..4]of longint=(0,0,1,-1); var n,l,i,j,tj:longint; a:array[0..301,0..301]of boolean; s:string; h:array[0..20001,1..2]of longint; procedure work(p,q:longint); var i,w,t,x,y:longint; begininc(tj);a[p,q]:=false;t:=1;w:=1;h[1,1]:=p;h[1,2]:=q;repeatfor i:=1 to 4 dobeginx:=h[t,1]+dx[i];y:=h[t,2]+dy[i];if (x>0)and(x<=n)and(y>0)and(y<=l)and(a[x,y]=true) thenbegininc(w);h[w,1]:=x;h[w,2]:=y;a[x,y]:=false;end;end;inc(t);until t>w; end;beginassign(input,'family.in');reset(input);assign(output,'family.out');rewrite(output);readln(n);fillchar(a,sizeof(a),false);l:=0;for i:=1 to n dobeginreadln(s);for j:=1 to length(s) doif s[j]=' ' then a[i,j]:=false elseif s[j]='*' then a[i,j]:=false elsea[i,j]:=true;if length(s)>l then l:=length(s);end;tj:=0;for i:=1 to n dofor j:=1 to l doif a[i,j]=true then work(i,j);write(tj);close(input);close(output); end.轉載于:https://www.cnblogs.com/YYC-0304/p/9500007.html
總結
以上是生活随笔為你收集整理的【普及组模拟赛】家族的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【普及组模拟赛】游戏
- 下一篇: 【普及组模拟赛】作业