[2016-01-21][HDU][2553]

[2016-01-21][POJ][2386]

  • /*************************************************************
  • 时间:2016-01-20  13:25:10  星期三
  • 题目编号:E POJ 2386
  • 题目大意:求水坑的个数,八连图
  • 方法:DFS清除水坑,看清除了多少次.
  • 解题过程遇到问题:
    • 建立dx dy的时候,逗号少打,结果造成 +1 - 1  (结果为0的错误)
    • 写dfs的时候,开头打标记,结束恢复(或者不恢复标记)
    • 进入下一层dfs先判断在进入,进入在判断效率低一些
  • *************************************************************/  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
int n , m;
char mp[110][110];
int dx[] = {-1,-1,-1,0,0,+1,+1, +1};
int dy[] = {-1,+1, 0,+1,-1, 0,+1,-1};
 
void dfs(int row,int col){
    mp[row][col] = '.';
    for(int i = 0;i < 8;i++){
        int x = row + dx[i];
        int y = col + dy[i];
        if(x >= 0 && y >= 0 && x < n && y < m && mp[x][y] == 'W')
            dfs( x, y );
    }
}
 
int main(){   
    scanf("%d%d",&n,&m);getchar();
    for(int i = 0;i < n ;i++ )
        gets(mp[i]);
 
    int res = 0;
    for(int i = 0;i < n;i++ )
        for (int j = 0;j < m;j++)
            if(mp[i][j] == 'W'){
                dfs(i,j);
                res++;
            }
 
    printf("%d\n",res);
    return 0;
}




来自为知笔记(Wiz)


posted on 2016-01-21 21:57  红洋  阅读(112)  评论(0)    收藏  举报

导航