Codeforces 377 A Maze【DFS】

题意:给出n*m的矩阵,矩阵由'.'和'#'组成,再给出k,表示需要在'.'处加k堵墙,使得剩下的'.'仍然是连通的

先统计出这个矩阵里面总的点数'.'为sum

因为题目说了一定会有一个解,所以找到一个'.',就开始搜,搜到sum-k个连通的点的时候跳出,剩下的没有访问过的点就全部填成墙

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<set>
 9 #include<queue> 
10 #include<algorithm>  
11 using namespace std;
12 
13 typedef long long LL;
14 const int INF = (1<<30)-1;
15 const int mod=1000000007;
16 const int maxn=1005;
17 
18 char g[maxn][maxn];
19 int vis[maxn][maxn];
20 int ans,n,m,k,cnt;
21 int dir[4][2]={1,0,-1,0,0,1,0,-1};
22 
23 void dfs(int x,int y){
24     vis[x][y]=1;
25     cnt++;
26     if(cnt==ans) return;
27     for(int i=0;i<4;i++){
28         if(cnt==ans) return;
29         int xx=x+dir[i][0];
30         int yy=y+dir[i][1];
31         if(xx<1||xx>n||yy<1||yy>m||vis[xx][yy]||g[xx][yy]!='.') continue;
32         dfs(xx,yy);
33     }    
34 }
35 
36 int main(){
37     scanf("%d %d %d",&n,&m,&k);
38     for(int i=1;i<=n;i++)
39      for(int j=1;j<=m;j++) cin>>g[i][j];
40      
41       ans=0;
42      for(int i=1;i<=n;i++){
43          for(int j=1;j<=m;j++){
44              if(g[i][j]=='.') ans++;
45          }
46      }
47      ans=ans-k;
48      
49      for(int i=1;i<=n;i++){
50          int flag=0;
51          for(int j=1;j<=m;j++){
52              cnt=0;
53              if(g[i][j]=='.'){
54                  dfs(i,j);
55                  flag=1;
56                  break;                 
57              }
58          }
59          if(flag) break;
60      }
61      
62      for(int i=1;i<=n;i++){
63          for(int j=1;j<=m;j++){
64              if(g[i][j]=='.'&&!vis[i][j]) g[i][j]='X';
65          }
66      }
67      
68      
69      for(int i=1;i<=n;i++){
70          for(int j=1;j<=m;j++)
71          printf("%c",g[i][j]);
72          printf("
");
73      }
74      return 0;
75 }
View Code
原文地址:https://www.cnblogs.com/wuyuewoniu/p/4442959.html