題目描述
在乙個與世隔絕的島嶼上,有乙個有趣的現象:同乙個家族的人家總是相鄰的(這裡的相鄰是指東南西北四個方向),不同的家族之間總會有河流或是山丘隔絕,但同乙個家族的人不一定有相同姓氏。現在給你島上的地圖,求出島上有多少個不同的家族。島上的地圖有n 行,每行有若干列,每個格仔中要麼是』空格表示大海,要麼是『 *』,表示河流或山丘,要麼是小寫字母,表示一戶人家的姓氏。
輸入第一行是個數字 n,表示下面資訊的行數,接下來是 n 行字元,每行由小寫字母和*號組成,有些行的最前面也可能包含若干連續的空格,表示這些區域是大海,每一行最多不超過 200 個字元。
輸出乙個數字,表示家族數。
樣例輸入
4 *zlw**pxh
l*zlwk*hx*
w*tyy**yyy
zzl樣例輸出
資料範圍限制
【資料範圍】
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);
varn,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);
vari,w,t,x,y:longint;
begin
inc(tj);
a[p,q]:=false;
t:=1;w:=1;
h[1,1]:=p;
h[1,2]:=q;
repeat
for i:=1to4
dobegin
x:=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) then
begin
inc(w);
h[w,1]:=x;
h[w,2]:=y;
a[x,y]:=false;
end;
end;
inc(t);
until t>w;
end;
begin
assign(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 do
begin
readln(s);
for j:=1
to length(s) do
if s[j]=' '
then a[i,j]:=false
else
if s[j]='*'
then a[i,j]:=false
else
a[i,j]:=true;
if length(s)>l then l:=length(s);
end;
tj:=0;
for i:=1
to n do
for j:=1
to l do
if a[i,j]=true
then work(i,j);
write(tj);
close(input);
close(output);
end.
1985 普及組模擬賽 家族(family)
題目描述 在乙個與世隔絕的島嶼上,有乙個有趣的現象 同乙個家族的人家總是相鄰的 這裡的相鄰是指東南西北四個方向 不同的家族之間總會有河流或是山丘隔絕,但同乙個家族的人不一定有相同姓氏。現在給你島上的地圖,求出島上有多少個不同的家族。島上的地圖有n 行,每行有若干列,每個格仔中要麼是空格表示大海,要麼...
2020 10 05 普及組 模擬賽C組總結
總結這次考試沒發揮好,第二題沒有拿滿分,下次要繼續努力 t1 superpow 10 題目大意 已知a b 超級冪 代表 b個a的冪,求n對數的超級冪之積的個位數。正確思路 當打表後可以發現 b是沒用的,如果b大於2,b就等於2,答案和原來的是一樣的。所以處理一下跑個快速冪就行了。至於為什麼拿10分...
2020 11 14 普及組 模擬賽C組總結
這是乙個好東西 作者主頁 t1 操作 題目大意 給你乙個數列,讓你執行一些操作後輸出。這一題找規律即可。t2 遊戲 題目大意 判斷每個人被攻擊和攻擊的情況是否符合題目要求。思路 找規律。因為中間不可能出現三個一樣的攻擊操作,所以只需要判斷有沒有大於3的連續操作,直接輸出個數即可。提示 t3 到達 題...