2011-07-29 15:29:18GrD
Rank the Languages d365 Q10336
d365: 10336 - Rank the Languages
內容 :
你可能有注意到世界上有許多地區使用英語及西班牙語。現在我們就要來對世界上所有地區使用的語言作個排行榜。
你會給一個地圖,在上面會標示各地區以幾他們所使用的語言。請看以下的地圖:
ttuuttdd
ttuuttdd
uuttuudd
uuttuudd
每個字元代表一種語言,並且區域被定義為同一個字元相連的地區。2個字元"相連"指的是該2字元有上、下、左、右四個方向鄰近的關係。所以在上圖中有3個區域說 t 語言,有3個區域說 u 語言,有1個區域說 d 語言。
你的任務就是要找出地圖中每種語言被說的區域數,並且按照一定的順序輸出。
輸入說明 :
輸入的第一列有一個整數 N
代表以下有幾組測試資料
每組測試資料的第一列有 2 個整數 H 及 W
代表此地圖的高度及寬度
接下來的 H 列每列有 W 個字元
所有的字元均為小寫的英文字(a~z)
輸出說明 :
對每組測試資料
先輸出 "World #n"
n 是第幾組測試資料
接下來輸出在此地圖中每種語言被說的區域數 (請由大到小排列)
如果有2種語言區域數相同
請依英文字的順序輸出 (例如i語言要在q語言之前)
請參考 Sample Output
範例輸入 :
若題目沒有特別說明,則應該以多測資的方式讀取,若不知如何讀取請參考 a001 的範例程式。
2
4 8
ttuuttdd
ttuuttdd
uuttuudd
uuttuudd
9 9
bbbbbbbbb
aaaaaaaab
bbbbbbbab
baaaaacab
bacccccab
bacbbbcab
bacccccab
baaaaaaab
bbbbbbbbb
範例輸出 :
World #1
t: 3
u: 3
d: 1
World #2
b: 2
a: 1
c: 1
提示 :
BFS或DFS或集合或 ? ? ?
Lucky 貓 翻譯
測資可能會有誤,或者是太簡單...
出處 :
Uva 10336 (管理:morris1028)
--------------------------------------------------------------------------------
拆題:Flooding 淹水 or BFS or DFS
我既不會bfs也不會dfs..... (喵啊!!圖論!!)
所以就把這題淹了.
另外最後的輸出方式可能不是最快的輸出,因為要round很多次 (maxi最高多少就要跑多少趟 :P)
--------------------------------------------------------------------------------
(**********************************************************************************)
(* Problem: d365 "10336 - Rank the Languages" from Uva 10336 *)
(* Language: PASCAL *)
(* Result: AC (38ms, 2568KB) on ZeroJudge *)
(* Author: grd at 2011-07-29 15:17:05 *)
(**********************************************************************************)
program languages;
const max=1001;
type arraytype=array[0..max,0..max]of integer;
var map:arraytype;
num:array[97..122]of longint;
temp:char;
h,w,check:longint;
row,col,run,time:longint;
procedure flood(x,y:longint); //flooding main
begin
if ((x<1)or(x>h))or((y<1)or(y>w)) then exit; //判斷退出,沒判定好不是out of range 就是
if map[x][y]=0 then exit; // runtime error =_ = | 淹水時記得牆的範圍
if map[x][y]<>check then exit; // 判斷是不是同一個區域
map[x][y]:=0;
flood(x+1,y); //上下左右在淹一次
flood(x-1,y);
flood(x,y+1);
flood(x,y-1);
end;
begin
readln(time);
for time:=1 to time do begin
readln(h,w);
fillchar(map,sizeof(map),0);
fillchar(num,sizeof(num),0);
for row:=1 to h do begin //用read務必要記得readln; 要不然會出亂子
for col:=1 to w do begin
read(temp);
map[row][col]:=ord(temp);
end;
readln; // ^
end;
for row:=1 to h do
for col:=1 to w do begin
if map[row][col]>0 then begin
check:=map[row][col]; //標記區塊
//if check=0 then continue;
inc(num[check]);
flood(row,col);
end;
end;
for run:=97 to 122 do if num[run]>check then check:=num[run];
writeln('World #',time);
while check<>0 do begin //來亂的輸出方式,找到maxi值後,從maxi 每次 maxi--
for run:=97 to 122 do //然後從頭到尾搜有沒有字是跟值一樣的,一樣的就輸出........
if num[run]=check then writeln(chr(run),': ',num[run]);
dec(check);
end;
end;
end.
------------
水題群! (不...是flooding 題): D365,Q10336 D165 D626
--------------------------------------------------------------------------------
拆題:Flooding 淹水 or BFS or DFS
我既不會bfs也不會dfs..... (喵啊!!圖論!!)
所以就把這題淹了.
另外最後的輸出方式可能不是最快的輸出,因為要round很多次 (maxi最高多少就要跑多少趟 :P)
--------------------------------------------------------------------------------
(**********************************************************************************)
(* Problem: d365 "10336 - Rank the Languages" from Uva 10336 *)
(* Language: PASCAL *)
(* Result: AC (38ms, 2568KB) on ZeroJudge *)
(* Author: grd at 2011-07-29 15:17:05 *)
(**********************************************************************************)
program languages;
const max=1001;
type arraytype=array[0..max,0..max]of integer;
var map:arraytype;
num:array[97..122]of longint;
temp:char;
h,w,check:longint;
row,col,run,time:longint;
procedure flood(x,y:longint); //flooding main
begin
if ((x<1)or(x>h))or((y<1)or(y>w)) then exit; //判斷退出,沒判定好不是out of range 就是
if map[x][y]=0 then exit; // runtime error =_ = | 淹水時記得牆的範圍
if map[x][y]<>check then exit; // 判斷是不是同一個區域
map[x][y]:=0;
flood(x+1,y); //上下左右在淹一次
flood(x-1,y);
flood(x,y+1);
flood(x,y-1);
end;
begin
readln(time);
for time:=1 to time do begin
readln(h,w);
fillchar(map,sizeof(map),0);
fillchar(num,sizeof(num),0);
for row:=1 to h do begin //用read務必要記得readln; 要不然會出亂子
for col:=1 to w do begin
read(temp);
map[row][col]:=ord(temp);
end;
readln; // ^
end;
for row:=1 to h do
for col:=1 to w do begin
if map[row][col]>0 then begin
check:=map[row][col]; //標記區塊
//if check=0 then continue;
inc(num[check]);
flood(row,col);
end;
end;
for run:=97 to 122 do if num[run]>check then check:=num[run];
writeln('World #',time);
while check<>0 do begin //來亂的輸出方式,找到maxi值後,從maxi 每次 maxi--
for run:=97 to 122 do //然後從頭到尾搜有沒有字是跟值一樣的,一樣的就輸出........
if num[run]=check then writeln(chr(run),': ',num[run]);
dec(check);
end;
end;
end.
------------
水題群! (不...是flooding 題): D365,Q10336 D165 D626