12C:未名冰场

总时间限制: 
1000ms
 
内存限制: 
65536kB
描述

每到冬天,未名湖就会结上冰,供溜冰爱好者玩耍。今年,当你路过未名湖时,发现只有未名湖的一部分区域结成了冰,你非常好奇,想知道一共有多少块结冰区域。假定未名湖是一个n*m的方形湖面,划分成n*m个格子,每一个格子都可能结冰或者未结冰。而一块结冰区域是指连通的结冰的格子组成的,当两个格子互相处于上下、左右或者对角相邻时,则它们是连通的。

输入
输入包含多组数组,每组数据的第一行是两个正整数n, m (1 <= n <= 100, 1 <= m <= 100),表示湖的行和列的数量,接下来包含n行,每行m个字符,表示湖上每个位置的状态。其中, "*"表示没有结冰,“@"表示该位置已经结冰。
当n=0时,表示输入结束。
输出
每组数据输出一行,输出连通的结冰区域的数量。
样例输入
1 1
*
3 5
*@*@*
**@**
*@*@*
1 8
@@****@*
5 5
****@
*@@*@
*@**@
@@@*@
@@**@
0 0
样例输出
0
1
2
2
 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 int n, m;
 5 int a[105][105];
 6 int dirx[8] = {0,0,1,1,1,-1,-1,-1};
 7 int diry[8] = {1,-1,0,1,-1,0,1,-1};
 8 void dfs(int x, int y, int val){
 9     a[x][y] = val;
10     for(int i = 0; i < 8; i++){
11         int nx = x+dirx[i], ny = y+diry[i];
12         if(a[nx][ny]==-1)
13             dfs(nx, ny, val);
14     }
15 }
16 int main(){
17     while(1){
18         cin>>n>>m;
19         if(n==0) return 0;
20         int i, j;
21         memset(a, 0, sizeof(a));
22         for(i = 1; i <= n; i++)
23             for(j = 1; j <= m; j++){
24                 char c; cin>>c;
25                 if(c=='@') a[i][j] = -1;
26             }
27         int ans = 0;
28         for(i = 1; i <= n; i++)
29             for(j = 1; j <= m; j++){
30                 if(a[i][j] == -1){
31                     ans++;
32                     dfs(i, j, ans);
33                 }
34             }
35         cout<<ans<<endl; 
36     }
37     return 0;
38 }

备注:是我擅长的连通块填充水题才能一次AC qwq

原文地址:https://www.cnblogs.com/fangziyuan/p/13158862.html