Nguồn đề bài: http://www.spoj.com/PTIT/problems/BCLKCOUN/
1. Đề bài BCLKCOUN spoj
Sau khi kết thúc OLP Tin Học SV, một số OLP-er quyết định đầu tư thuê đất để trồng rau.
Mảnh đất thuê là một hình chữ nhật N x M (1<=N<=100; 1<=M<=100) ô đất hình vuông. Nhưng chỉ sau đó vài ngày, trận lụt khủng khiếp đã diễn ra làm một số ô đất bị ngập :(( Mảnh đất biến thành một số các ao.
Các OLP-er quyết định chuyển sang nuôi cá 😀 Vấn đề lại nảy sinh, các OLP-er muốn biết mảnh đất chia thành bao nhiêu cái ao để có thể tính toánnuôi trồng hợp lý. Bạn hãy giúp các bạn ý nhé.
Chú ý: Ao là gồm một số ô đất bị ngập có chung đỉnh. Dễ nhận thấy là một ô đất có thể có tối đa 8 ô chung đỉnh.
INPUT:
* Dòng1: 2 số nguyên cách nhau bởi dấu cách: N và M
* Dòng 2..N+1: M kí tự liên tiếp nhau mỗi dòng đại diện cho 1 hàng các ô đất.
Mỗi kí tự là ‘W’ hoặc ‘.’ tương ứng với ô đất đã bị ngập và ô đất vẫn còn nguyên.
OUTPUT:
* Dòng 1: 1 dòng chứa 1 số nguyên duy nhất là số ao tạo thành.
SAMPLE INPUT :
10 12
W……..WW.
.WWW…..WWW
….WW…WW.
………WW.
………W..
..W……W..
.W.W…..WW.
W.W.W…..W.
.W.W……W.
..W…….W.
SAMPLE OUTPUT :
3
2. Gợi ý BCLKCOUN spoj PTIT
– Sử dụng BFS hoặc DFS để đếm số thành phần liên thông
3. Code tham khảo BCLKCOUN spoj PTIT
const fi = ''; fo = ''; maxN = 1000; dx:array[1..8] of integer=(-1,-1,-1,0,0,1,1,1); dy:array[1..8] of integer=(-1,0,1,-1,1,-1,0,1); var qx, qy : array[1..10000] of longint; a : array[0..maxN,0..maxN] of char; count, i, j, m, n : longint; procedure init; var i, j : longint; begin readln(n,m); fillchar(a,sizeof(a),'.'); for i:=1 to n do begin for j:=1 to m do read(a[i,j]); readln; end; end; procedure bfs(u,v:longint); var x,y,xx,yy,first,last,k:longint; begin first:=1; last:=1; qx[first]:=u; qy[first]:=v; repeat x:=qx[first]; y:=qy[first]; inc(first); for k:=1 to 8 do begin xx:=x+dx[k]; yy:=y+dy[k]; if a[xx,yy]='W' then begin a[xx,yy]:='.'; inc(last); qx[last]:=xx; qy[last]:=yy; end; end; until first > last; end; begin assign(input,fi);reset(input); assign(output,fo);rewrite(output); init; count:=0; for i:=1 to n do for j:=1 to m do if a[i,j]='W' then begin inc(count); a[i,j]:='.'; bfs(i,j); end; writeln(count); close(input);close(output); end.