zoukankan      html  css  js  c++  java
  • AOJ 0118 深度优先搜索

    日文题。。。

    题意:一个面积为H*W的果园,种了苹果,梨和蜜柑。相邻(上下左右)的果树属于同一个区域,问果园共有多少个区域。

    分析:迷宫问题。对于每一个格子,可以用深度优先搜索把相同果树的格子遍历并标记。也就是说,每做一次DFS,消灭掉一个区域。只需要遍历果园,对每一个未被标记的格子做DFS,做DFS的次数就是果园的区域数。这里不需要另外用其他数组标记格子已访问,只需要将格子的元素改为一个不会出现的元素如1即可。

    C++代码:

     1 #include <cstdio>
     2 #include <cstring>
     3 
     4 const int MAX_H = 100;
     5 const int MAX_W = 100;
     6 
     7 //输入
     8 int H, W;
     9 char g[MAX_H][MAX_W + 1];
    10 
    11 int d[4][2] = {{0, -1}, {0, 1}, {1, 0}, {-1, 0}};        //方向
    12 
    13 //深度优先遍历g[i][j]同类局域
    14 void dfs(int x, int y, int c){
    15     for(int i = 0; i < 4; i ++){
    16         int nx = x + d[i][0], ny = y + d[i][1];
    17         if(0 <= nx && nx < H && 0 <= ny && ny < W && g[nx][ny] == c){
    18             g[nx][ny] = '1';
    19             dfs(nx, ny, c);
    20         }
    21     }
    22 }
    23 
    24 void solve(){
    25     //遍历果园,每到一个新位置,遍历该位置能到达的地方
    26     int ans = 0;
    27     for(int i = 0; i < H; i ++){
    28         for(int j = 0; j < W; j ++){
    29             if(g[i][j] != '1'){
    30                 ans ++;
    31                 char c = g[i][j];
    32                 g[i][j] = '1';
    33                 dfs(i, j, c);
    34             }
    35         }
    36     }
    37     printf("%d
    ", ans);
    38 }
    39 
    40 int main(int argc, char const *argv[]){
    41 
    42     while(scanf("%d %d", &H, &W)){
    43         if(H == 0 && W == 0) break;
    44         for(int i = 0; i < H; i ++){
    45             scanf("%s", g[i]);
    46         }
    47         solve();
    48     }
    49 
    50     return 0;
    51 }
  • 相关阅读:
    数据库基础——EXISTS和IN
    C#基础——加密
    C#基础——派生和继承
    SQL Server——报表服务
    SQL Server——SQL Server Profiler
    UML基础——UML简介和历史
    C#基础——密码加密
    C#(ASP.NET)错误: 无法获取属性“0”的值: 对象为 null 或未定义 关键字 'user' 附近有语法错误。
    SQL Server——存储过程
    链表的声明及操作
  • 原文地址:https://www.cnblogs.com/7hat/p/3585902.html
Copyright © 2011-2022 走看看