zoukankan      html  css  js  c++  java
  • 纪中第二天(c组)(3)

    题目(3)

    全球气候变暖,小镇A面临水灾。于是你必须买一些泵把水抽走。泵的抽水能力可以认为是无穷大,但你必须把泵放在合适的位置,从而能使所有的水能流到泵里。小镇可以认为是N * M的矩阵。矩阵里的每个单元格都是一个‘a’- ‘z’小写字母,该小写字母表示该格子的高度,字母大的表示该单元格比较高,反之,表示该格子高度比较低。当前单元格的水可以流到上、下、左、右四个格子,但必须满足这些格子的高度是小于或者等于当前格子的高度。现在,给你一些N * M的矩阵,你至少要买多少个泵,才能把所有格子的水都能被抽走?

    输入

     多组测试数据。

     第一行:K,表示有K组测试数据。 1 <= K <= 5.

     接下来有K组测试数据,每组测试数据格式如下:

         第一行:两个正数, N , M . 1 <= N, M <= 50,表示小镇的大小。

         接下来有N行,每行有M个小写字母,表示小镇的地图。

    输出

    共K行,每行对应一组数据。至少要买多少个泵,才能把所有格子的水都能抽走。

    样例输入

     2
     5 5
     ccccc
     cbbbc
     cbabc
     cbbbc
     ccccc
     4 9
     cbabcbabc
     cbabcbabc
     cbabcbabc
     cbabcbabc

    样例输出

    1
    2

    样例输入

     1
     11   11
     ccccccccccc
     caaaaaaaaac
     caaaaaaaaac
     caazpppzaac
     caapdddpaac
     caapdddpaac
     caapdddpaac
     caazpppzaac
     caaaaaaaaac
     caaaaaaaaac
     ccccccccccc

    样例输出

      2

    思路

    广搜。每次找到现在的最高点,向四周扩散,直到无法扩散为止。走完所有后输出解即可。

    复制代码
    #include<cstdio>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    char a[51][51][6],c;
    int m[6],n[6],sum=0,time1;
    bool b[51][51][6];
    void bfs(int x,int y,int i1)
    {
        if(x<1||x>n[i1]||y<1||y>m[i1])//过界 
        return ;
        b[x][y][i1]=true;
        
        if(a[x][y][i1]<=a[x-1][y][i1])//上 
            if(b[x-1][y][i1]==false)
                bfs(x-1,y,i1);
                
        if(a[x][y][i1]<=a[x][y-1][i1])//左
            if(b[x][y-1][i1]==false)
                bfs(x,y-1,i1);
                
        if(a[x][y][i1]<=a[x][y+1][i1])//右 
            if(b[x][y+1][i1]==false)
                bfs(x,y+1,i1);
                
        if(a[x][y][i1]<=a[x+1][y][i1])//下 
            if(b[x+1][y][i1]==false)
                bfs(x+1,y,i1);
    }
    int main()
    {
        memset(b,false,sizeof(b));
        scanf("%d",&time1);
        for(int i1=1;i1<=time1;i1++)
        {
            scanf("%d%d",&n[i1],&m[i1]);
            for(int i=1;i<=n[i1];i++)
                for(int j=1;j<=m[i1];j++)
                    cin>>a[i][j][i1];
        }
        for(int i1=1;i1<=time1;i1++)
        {
            sum=0;
            for(int i=26;i>=1;i--)
            {
                c='z'-i+1;//最高点搜起 
                for(int j=1;j<=n[i1];j++)
                    for(int k=1;k<=m[i1];k++)
                        if(a[j][k][i1]==c)
                            if(b[j][k][i1]==false)
                            {
                                bfs(j,k,i1);
                                sum++;
                            }
            }
            cout<<sum<<endl;
        }
        return 0;
    }
    复制代码

     血与泪的教训:再也不用英文单词了,time尽然是函数,100分离我远去了!!!!

  • 相关阅读:
    今天面试一些程序员(新,老)手的体会
    UVA 10635 Prince and Princess
    poj 2240 Arbitrage
    poj 2253 Frogger
    poj 2485 Highways
    UVA 11258 String Partition
    UVA 11151 Longest Palindrome
    poj 1125 Stockbroker Grapevine
    poj 1789 Truck History
    poj 3259 Wormholes
  • 原文地址:https://www.cnblogs.com/abcdhh/p/11289210.html
Copyright © 2011-2022 走看看