BNUOJ flower (搜索)

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

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

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

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


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

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

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

Input

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

Output

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

Sample Input

Sample Input1
6 7
.......
..***..
..*..*.
..*..*.
...**..
.......
Sample Input2
5 7
.......
..***..
..*.*..
..***..
.......

Sample Output

Sample Output1
4
Sample Output2
1
 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <cstring>
 5 using namespace std;
 6 int map[101][101];
 7 int dirx[4]={1,-1,0,0};
 8 int diry[4]={0,0,-1,1};
 9 int m,n;
10 int dfs(int x,int y)
11 {
12     int i,j,dx,dy;
13     if(x<0||x>m+1||y<0||y>n+1||map[x][y]==1)
14         return 0;
15     map[x][y]=1;
16     for(i=0;i<4;i++)
17     {
18         dx=x+dirx[i];
19         dy=y+diry[i];
20         dfs(dx,dy);
21     }
22     return 0;
23 }
24 int main()
25 {
26     int i,j;
27     //freopen("in.txt","r",stdin);
28     while(cin>>m>>n)
29     {
30         char s;
31         bool flag=0;
32         int sum=0;
33         memset(map,0,sizeof(map));
34         for(i=1;i<=m;i++)
35         {
36             for(j=1;j<=n;j++)
37             {
38                 cin>>s;
39                 map[i][j]=(s=='.'?0:1);
40             }
41         }
42         dfs(0,0);
43         for(i=1;i<=m;i++)
44         {
45             for(j=1;j<=n;j++)
46                 if(map[i][j])
47                     sum++;
48         }
49         cout<<m*n-sum<<endl;
50     }
51 }

 

posted @ 2015-10-20 22:41  御心飞行  阅读(222)  评论(0编辑  收藏  举报