码迷,mamicode.com
首页 > 其他好文 > 详细

UVA 572 Oil Deposits (DFS)

时间:2016-07-24 17:47:30      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:

题意:

  给你一个M 行N 列的矩阵,其中仅有两种符号,“@” 和 “×”,问你有多少个连通块, 所谓连通就是一个“@” 的上下左右以及对角线有另外一个“@”,则说明者两个“@”连通的。

****@
*@@*@
*@**@
@@@*@
@@**@

 

比如此矩阵中仅有2个连通块。

思路:

   从第一个“@”开始DFS ,找到与它连通的并标记为同一数字,直到所有连通的都标记完,再从下一个没被标记的“@”处DFS,并标记为另外一个数字,最后查看有多少个数字就可以了。

代码:

 1 #include <iostream>
 2 #include <cmath>
 3 #include <cstdio>
 4 #include <cstring>
 5 #include <cstdlib>
 6 #include <algorithm>
 7 #include <string>
 8 
 9 typedef long long LL;
10 using namespace std;
11 const double PI = acos(-1);
12 const int MAXN = 100;
13 int idx[MAXN + 3][MAXN + 3];
14 char map[MAXN + 3][MAXN + 3];
15 
16 void dfs(int x, int y, int cnt){
17     idx[x][y] = cnt;//都标记为同一数字
18     for(int i = -1; i <= 1; i++){//两层循环排查周围的点
19         for(int j = -1; j <= 1; j++){
20             if(x + i >= 0 && y + j >= 0 && idx[x + i][y + j] == 0 && map[x + i][y + j] == @)//排除掉不满足情况的点
21                 dfs(x + i, y + j, cnt);
22         }
23     }
24 }
25 
26 int main(){
27     //freopen("input", "r", stdin);
28     int n, m;
29     while(scanf("%d%d", &n, &m) && (n != 0)){
30         memset(map, 0, sizeof(map));
31         memset(idx, 0, sizeof(idx));
32         for(int i = 0;  i < n; i++) scanf("%s", map[i]);
33         int cnt = 0;
34         for(int i = 0; i < n; i++){
35             for(int j = 0; j < m; j++){
36                 if(!idx[i][j] && map[i][j] == @){//每次都从没被标记且时“@”处开始新的DFS 
37                     dfs(i, j, ++cnt);
38                 }
39             }
40         }
41         printf("%d\n", cnt);
42     }
43     return 0;
44 }

 

UVA 572 Oil Deposits (DFS)

标签:

原文地址:http://www.cnblogs.com/Ash-ly/p/5701174.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!