您的位置:首页 > 其它

BNUOJ 1038 Flowers

2015-10-19 22:32 155 查看
春天到了,师大的园丁们又开始忙碌起来了.

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

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

广场用一个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\n",sum);

}
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: