洛谷P1506 拯救oibh总部

深搜 灌水
这题 我们就相当于求 路径上不经过 * 能到达边界的点有几个
然后我就可以从边界上开始灌水,染色,遇到 * 就 return
然后就相当于 没有被洪水填到的就是 不会到边界的节点

 

 1 include <cstdio>
 2 #include <cmath>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <string>
 6 #include <algorithm>
 7 #include <iomanip>
 8 #include <iostream>
 9 using namespace std ;
10 
11 const int dx[5] = {0,1,0,0,-1},
12           dy[5] = {0,0,1,-1,0} ;
13 int n,m,ans ;
14 char a[501][501] ;
15 
16 inline bool pd(int xx,int yy) 
17 {
18     if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]=='0') return true ;
19     return false ; 
20 }
21 
22 void dfs(int x,int y ) 
23 {
24     int xx,yy ;
25     for(int i=1;i<=4;i++) 
26     {
27         xx = x+dx[i] ;
28         yy = y+dy[i] ;
29         if(pd(xx,yy)) 
30         {
31             a[xx][yy] = '*' ;
32             dfs(xx,yy) ;
33         }
34     }
35 }
36 
37 int main() 
38 {
39     scanf("%d%d",&n,&m) ;
40     for(int i=1;i<=n;i++) 
41         scanf("%s",a[ i ]+1) ;
42     for(int i=1;i<=n;i++) 
43     {
44         if(a[i][1]=='0') a[i][1] = '*',dfs(i,1) ; 
45         if(a[i][m]=='0') a[i][m] = '*',dfs(i,m) ;
46     }
47     for(int i=1;i<=m;i++)
48     {
49         if(a[1][i]=='0') a[1][i] = '*',dfs(1,i) ;
50         if(a[n][i]=='0') a[n][i] = '*',dfs(n,i) ;
51     }
52     ans = 0 ;
53     for(int i=1;i<=n;i++) 
54         for(int j=1;j<=m;j++) if(a[i][j]=='0') ans++ ;
55     printf("%d\n",ans) ; 
56     return 0 ;
57 }

 

posted @ 2017-05-13 23:00  third2333  阅读(367)  评论(0编辑  收藏  举报