CodeForces 378C Maze (DFS)
题意:给一个由“.”组成的联通区域,求再添加k个‘#'以后还是联通区域的方案。
分析:做题的时候犯二了,用DFS,一直搜到边缘,然后从边缘依次往回 回溯,回溯的过程中填充’#‘
一直填充k个。
因为在搜索的过程中,一直都是vis[][]标记的,所以时间复杂度最多只是搜了所有的边,即500*500*4.
DFS搜索的时间复杂度,取决于边的个数。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <queue> 7 #include <algorithm> 8 #define LL __int64 9 const int maxn = 500+10; 10 using namespace std; 11 char s[maxn][maxn]; 12 int dx[] = {0, 0, 1, -1}; 13 int dy[] = {1, -1, 0, 0}; 14 int vis[maxn][maxn]; 15 int n, m, cnt; 16 void dfs(int fx, int fy) 17 { 18 vis[fx][fy] = 1; 19 for(int i = 0; i < 4; i++) 20 { 21 int a, b; 22 a = fx+dx[i]; 23 b = fy+dy[i]; 24 if(a>=1&&a<=n && b>=1&&b<=m){} 25 else continue; 26 if(s[a][b]!='.') continue; 27 if(!vis[a][b]) 28 dfs(a, b); 29 } 30 if(cnt) 31 { 32 cnt --; 33 vis[fx][fy] = 2; 34 } 35 } 36 37 int main() 38 { 39 int i, j; 40 int fx, fy; 41 while(~scanf("%d%d%d", &n, &m, &cnt)) 42 { 43 memset(vis, 0, sizeof(vis)); 44 memset(s, 0, sizeof(s)); 45 for(i = 1; i <= n; i++) 46 { 47 getchar(); 48 for(j = 1; j <= m; j++) 49 { 50 scanf("%c", &s[i][j]); 51 if(s[i][j]=='.') 52 { 53 fx = i; 54 fy = j; 55 } 56 } 57 } 58 dfs(fx, fy); 59 60 for(i = 1; i <= n; i++) 61 { 62 for(j = 1; j <= m; j++) 63 { 64 if(vis[i][j]==2) 65 printf("X"); 66 else 67 printf("%c", s[i][j]); 68 } 69 printf("\n"); 70 } 71 } 72 return 0; 73 }