• BNUOJ 1038 Flowers


    春天到了,师大的园丁们又开始忙碌起来了.

    京师广场上有一块空地,边界围成了一个多边形,内部被划分成一格一格的.园丁们想在这个多边形内的每一格内种植一些花.

    现在请你帮忙计算一下一共最多可以种多少花.

    广场用一个M*N的字符数组表示,"."和"*"代表一个方格,其中"*"代表空地的边界,"."是空格,只有边界内部的空格才能用于种花.
    一个空格位于边界内部,当且仅当由该点出发只允许向上、下、左、右四个方向移动,最终都会遇到边界。


    例如下面就是一个6*7的广场

    .......
    ..***..
    ..*..*.
    ..*..*.
    ...**..
    .......

    种花方案如下(数字代表的地方)
    .......
    ..***..
    ..*12*.
    ..*34*.
    ...**..
    .......

     

    Input

    输入数据第一行是M和N(M和N不超过100),代表有广场的大小
    接下来就是一个M*N的字符矩阵,是广场的表示
     

    Output

    对应于输入数据,输出一个整数,给出输入的情形能够种的花数目.
     

    Sample Input

    6 7
    .......
    ..***..
    ..*..*.
    ..*..*.
    ...**..
    .......
    5 7
    .......
    ..***..
    ..*.*..
    ..***..
    .......

    Sample Output

    4
    1

    一般想得到的方法是搜索大法,当然这道题也可以直接暴力循环
    #include<stdio.h>
    int k[102][102];
    char l[102];
    int n,m;
    int x[4]={-1,0,0,1},y[4]={0,-1,1,0};
    void dfs(int a,int b)
    {
        for(int i=0;i<4;i++)
        {
            int xx=a+x[i];
            int yy=b+y[i];
            if(xx>-1&&xx<n&&yy>-1&&yy<m&&k[xx][yy]!=0)
            {
                k[xx][yy]=0;
                dfs(xx,yy);
            }
        }
    }
    int main()
    {  while(scanf("%d%d",&n,&m)!=EOF)
        {int flag=0,p,q;
      for(int i=0;i<n;i++)
     {
    
                           
                scanf("%s",l); for(int j=0;j<m;j++)
               
                {
                    if(l[j]=='.')
                        k[i][j]=1;
                    else k[i][j]=0;
                }
            }
            for(int i=0;i<m;i++)
            {
                if(k[0][i]==1)
                {
                    k[0][i]=0;
                    dfs(0,i);
                }
                if(k[n-1][i]==1)
                {
                    k[n-1][i]=0;
                    dfs(n-1,i);
                }
            }
            for(int i=1;i<n-1;i++)
            {
                if(k[i][0]==1)
                {
                    k[i][0]=0;
                    dfs(i,0);
                }
                if(k[i][m-1]==1)
                {
                    k[i][m-1]=0;
                    dfs(i,m-1);
                }
            }
            int sum=0;
            for(int i=0;i<n;i++)
                for(int j=0;j<m;j++)
                    if(k[i][j]==1)
                        sum++;  printf("%d
    ",sum);
    
              }
    }
    View Code
  • 相关阅读:
    怎么防止重复提交
    如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?
    什么是 JavaConfig?
    Spring Boot 有哪些优点?
    GBK和GB2312编码
    2.补充:计算机表示的单位:
    python中字符串的编码和解码
    Spring Boot 有哪些优点?
    Maven的工程类型有哪些?
    Maven仓库是什么
  • 原文地址:https://www.cnblogs.com/dzzy/p/4893333.html
Copyright © 2020-2023  润新知