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("\n");

73      }

74      return 0;

75 }
View Code

 

你可能感兴趣的:(codeforces)