zoukankan      html  css  js  c++  java
  • Lake Counting

    试题描述

    有一个大小为M*N的园子,雨后积起了水。八连通的积水被认为是连接在一起的。请求出园子里共有多少水洼?(八连通指的是下面图中相对W的*的部分)
    ***
    *W*
    ***
    限制条件:
    N,M≤100

    输入
    第一行包含两个正整数 N 和 M,表示将一个园子地面分成N*M块方格,N 行,M列,接下来的 N 行描述了园子地面状况,其中‘W’表示积水的水洼,‘.’表示没有积水。
    输出
    仅一个数,表示水洼的总数。
    输入示例
    10 12
    w........ww.
    .www.....www
    ....ww...ww.
    .........ww.
    .........w..
    ..w......w..
    .w.w.....ww.
    w.w.w.....w.
    .w.w......w.
    ..w.......w.
    输出示例
    3
     

    其实就是八连块。用dfs(即深度搜索)可以解决。

     1 #include <iostream>
     2 #define MAXN 101
     3 using namespace std;
     4 char a[MAXN][MAXN];
     5 int m,n,flag[MAXN][MAXN];
     6 
     7 void dfs(int i,int j,int id)  //dfs函数每运行一次,答案(即cnt)++; 
     8 {
     9     if(i<0||i>=m||j<0||j>=n) return;  //如果出界,退出递归 
    10     if(flag[i][j]>0||a[i][j]!='w') return;  //如果当前格子搜索过或者不是水洼,退出递归 
    11     flag [i][j]=id;//记录当前格子被访问过 
    12     dfs(i-1,j-1,id); //开始八连块 
    13     dfs(i-1,j,id);
    14     dfs(i-1,j+1,id);
    15     dfs(i,j-1,id);
    16     dfs(i,j+1,id);
    17     dfs(i+1,j-1,id);
    18     dfs(i+1,j,id);
    19     dfs(i+1,j+1,id);
    20 }
    21 int main()
    22 {
    23     int j,i,cnt=0;
    24     cin>>m>>n;
    25     for(i=0;i<m;i++)
    26         for(j=0;j<n;j++) cin>>a[i][j];
    27     for(i=0;i<m;i++)
    28     {
    29         for(j=0;j<n;j++)
    30         {
    31             if(flag[i][j]==0&&a[i][j]=='w') dfs(i,j,++cnt);  //如果是水洼,就以当前位置为中心向它的八个方面找水洼。 
    32         }
    33     }
    34     cout<<cnt;
    35     return 0;
    36 }
    Lake Counting
  • 相关阅读:
    WPF Style和Template
    WPF自定义命令
    Vue-cli proxyTable 解决开发环境的跨域问题
    mongoose 获取某个存在的collecion 里的数据
    express+mongodb+mongoose简单入门
    服务器环境配置nginx / php / php-fpm(一)
    vue 循环前十条数据
    nodejs express的基本用法
    nodejs querystring
    nodejs fs.readFile
  • 原文地址:https://www.cnblogs.com/YXY-1211/p/5166464.html
Copyright © 2011-2022 走看看