zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    svn cleanup failed–previous operation has not finished 解决方法
    开源SNS社区系统推荐
    从网络获取图片本地保存
    MS SQL Server 数据库连接字符串
    KeepAlive
    Configure Git in debian
    sqlserver query time
    RPi Text to Speech (Speech Synthesis)
    SQL Joins with C# LINQ
    search or reseed identity columns in sqlserver 2008
  • 原文地址:https://www.cnblogs.com/dzzy/p/4893333.html
Copyright © 2011-2022 走看看