BNUOJ flower (搜索)
春天到了,师大的园丁们又开始忙碌起来了.
京师广场上有一块空地,边界围成了一个多边形,内部被划分成一格一格的.园丁们想在这个多边形内的每一格内种植一些花.
现在请你帮忙计算一下一共最多可以种多少花.
广场用一个M*N的字符数组表示,"."和"*"代表一个方格,其中"*"代表空地的边界,"."是空格,只有边界内部的空格才能用于种花.
一个空格位于边界内部,当且仅当由该点出发只允许向上、下、左、右四个方向移动,最终都会遇到边界。
例如下面就是一个6*7的广场
.......
..***..
..*..*.
..*..*.
...**..
.......
种花方案如下(数字代表的地方)
.......
..***..
..*12*.
..*34*.
...**..
.......
京师广场上有一块空地,边界围成了一个多边形,内部被划分成一格一格的.园丁们想在这个多边形内的每一格内种植一些花.
现在请你帮忙计算一下一共最多可以种多少花.
广场用一个M*N的字符数组表示,"."和"*"代表一个方格,其中"*"代表空地的边界,"."是空格,只有边界内部的空格才能用于种花.
一个空格位于边界内部,当且仅当由该点出发只允许向上、下、左、右四个方向移动,最终都会遇到边界。
例如下面就是一个6*7的广场
.......
..***..
..*..*.
..*..*.
...**..
.......
种花方案如下(数字代表的地方)
.......
..***..
..*12*.
..*34*.
...**..
.......
Input
输入数据第一行是M和N(M和N不超过100),代表有广场的大小
接下来就是一个M*N的字符矩阵,是广场的表示
接下来就是一个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 }