zoukankan      html  css  js  c++  java
  • 【JZOJ】1341. water(水流)

    题目大意 你必须买一些泵把水抽走。泵的抽水能力可以认为是无穷大,但你必须把泵放在合适的位置,小镇可以认为是N * M的矩阵。矩阵里的每个单元格都是一个‘a’- ‘z’小写字母,该小写字母表示该格子的高度,字母大的表示该单元格比较高,反之,表示该格子高度比较低。当前单元格的水可以流到上、下、左、右四个格子,一共要多少个泵?

    这道题目可以用搜索做,为什么呢?

    我们可以把小镇当做一个地图来看*mn**的地图,我知道每一个格子的深度,我要找最深的那一个,只能用上下左右来进行寻找

    我们就可以转化成,在一张n*m(个格子组成的)大小的地图中,找到最大的那一个格子。

    于是我们便可以想到用dfs,但并不完全是dfs

    我们可以用一个数组来保存状态,s[i][j],如果这一个格子没有被标记过(也就是没有走过),并且这个格子在我正张地图的范围之内,便可以执行我们的dfs函数 最后输出ans

    在dfs函数中我们先用s[i][j]来保存当前状态, 之后再进行搜索,我们有上下左右四个方向进行移动,循环来保存新的x,y;之后再进行判断新的x与y是否再范围之内,我们的s数组是否标记过,再是判断当前位置是否离开了原位(很重要必须得离开原位),之后再将我们得到得新的x与y,进行调用,再做标记(记得要清零,标记放循环前)

    其实这dfs很像递归但又像dfs。。。。

    这样这道题就完成了;

    上代码吧

     1 include<iostream>
     2 include<cstdio>
     3 include<cmath>
     4 include<algorithm>
     5 include<cstring>
     6 using namespace std;
     7 
     8 const int maxn= 53;
     9 
    10 int N, M;
    11 
    12 char maze[maxn][maxn];
    13 
    14 char s[maxn][maxn];
    15 
    16 int xi[] = {0, 0, -1, 1};
    17 
    18 int yi[] = {1, -1, 0, 0};
    19 
    20 void dfs(int x, int y) { s[x][y]=1; for(int i=0; i<4; i++) {
    21 
    22     int nx=x+xi[i]; 
    23 
    24     int ny=y+yi[i]; 
    25 
    26     if(nx>=0&&nx<N&& ny>=0&&ny<M&&s[nx][ny]==0&&maze[nx[ny]>=maze[x][y]) {
    27         dfs(nx,ny);
    28 
    29     }
    30 
    31 }
    32 }//一个很简单的搜索
    33 
    34 int main() {
    35 
    36 int t=0;
    37 
    38 cin>>t;
    39 
    40 while(t--) {
    41 
    42     cin>>N>>M;
    43 
    44     for(int i=0;i<N;i++) {
    45 
    46         cin>>maze[i];
    47 
    48     }
    49 
    50     memset(s,0,sizeof(s));
    51 
    52     int ans=0;
    53 
    54     for(char c='a';c<='z';c++) {
    55 
    56         for(int i = 0; i < N; i++) {
    57 
    58             for(int j = 0; j < M; j++) {
    59 
    60                 if(s[i][j] == 0 && maze[i][j] == c){
    61 
    62                     dfs(i, j);
    63 
    64                     ans++;
    65 
    66                 }
    67 
    68             }
    69 
    70         }
    71 
    72     }
    73 
    74     cout<<ans<<endl;
    75     return 0;
    76 }
  • 相关阅读:
    解决远程桌面复制文件大于3G出错问题
    c++builder Form重载WindowProc、WndProc 截获消息
    FireDAC指定mssql驱动
    C++Builder 增加IPEdit控件
    MySQL 字符串按数值进行排序
    Java POI导出Word表格并使用输出流下载文件弹出打开保存框
    Java POI导出Excel并使用输出流下载文件弹出打开保存框
    MySQL 查询除某些字段以外的值
    MySQL 一个字段多个值查询
    Java Calendar 计算两个时间相隔天数
  • 原文地址:https://www.cnblogs.com/WestJackson/p/11343622.html
Copyright © 2011-2022 走看看