CodeForces 377A-Maze(DFS找连通块)

简介: CodeForces 377A-Maze(DFS找连通块)

本题的来源在CodeForces上,题目是英文,在洛谷上面直接给出了题目翻译,如下:👇👇👇


题意翻译:


题目描述:


小P非常的喜欢方格迷宫。方格迷宫是一个n*m的由墙和空地构成的长方形方阵。只有当两点满足四联通条件时才能走过去。


小P画了一个迷宫,里面所有的空地都是四连通的。但闲着没事干的小P认为自己画的迷宫里小墙太多了很难看,所以他希望能够通过把迷宫中k个格子从空地变成墙但不破坏整张图的连通性(即仍然保持所有空地在一个四连通块中)


但是小P太蠢了做不来,请你帮助他。


输入: 第一行n,m,k(描述如题) 第二到n+1行: 每行m个字符,分别是'.'或'#'。 '.'表示空地,'#'表示墙。 输出: 把整张图原样打出来,但是被你修改的格子输出'X'。


样例输入1:


3 4 2


#..#


..#.


#...  


样例输出1:


#.X#


X.#.


#...  


样例输入2:


5 4 5



#...


#.#.


.#..


...#


.#.#  


样例输出2:


#XXX


#X#.


X#..


...#


.#.#  


解题思路:


根据题目翻译,我们可以这样考虑:题目要求将原图中的 k 个 '.' 修改为 'X' ,并且保证原图的连通性。我们可以先将原图中的空地数目计算出来,然后把这些空地全部修改为 'X' ,之后开始搜索,在地图中如果找到了某一条路径是连通的,那么我们就把这条路径上的 'X' 再全部修改为 '.' 就可以了!!!仔细思考一下,你会发现这道题的输出结果并不唯一!!!


AC Code:  


#include<bits/stdc++.h>
using namespace std;
#define N 501
char s[N][N];//存入地图的数组 
int n,m,k,ans,sum,num;
int dx[]={0,0,1,-1};//这两个是方向数组 
int dy[]={1,-1,0,0};
bool judge(int x,int y) {//越界判断的函数 
  if(x>=0&&x<n&&y>=0&&y<m)
    return true;
  return false;
}
void dfs(int x,int y) {
  if(sum==ans) {//将所有空地都更换完,此时已连通!!! 
    return ;
  }
  s[x][y]='.';//将搜索过的围墙换成空地 
  sum++;//记录空地的数目 
  for(int i=0;i<4;i++) {//四个方向去搜索连通块 
    int tx=x+dx[i];
    int ty=y+dy[i];
    if(judge(tx,ty)&&s[tx][ty]=='X') {//不越界并且这个点是之前修改过的围墙 
      dfs(tx,ty);//继续下一个点去搜索连通块 
    }
  }
}
int main() {
  scanf("%d %d %d",&n,&m,&k);
  for(int i=0;i<n;i++) {
    for(int j=0;j<m;j++) {
      scanf(" %c",&s[i][j]);//%前面的空格确保输入完整 
      if(s[i][j]=='#') {
        num++;//记录一下围墙的数量 
      }
      if(s[i][j]=='.') {//将地图中'.'都换成'X'
        s[i][j]='X';
      }
    }
  }
  ans=n*m-num-k;//地图总数减去围墙数量,再减去需要更换的k的数量
  //即ans表示的是空地数量 
  for(int i=0;i<n;i++) {
    for(int j=0;j<m;j++) {
      if(s[i][j]=='X') { 
        dfs(i,j);//随便找一个点开始搜索连通块
      }
    }
  }
  for(int i=0;i<n;i++) {
    for(int j=0;j<m;j++) {
      printf("%c",s[i][j]);//打印更新过的地图 
    }
    printf("\n");
  }
  return 0;
}

相关文章
|
数据采集 自然语言处理 搜索推荐
图文详解 DFS 和 BFS | 算法必看系列知识二十四
深度优先遍历(Depth First Search, 简称 DFS) 与广度优先遍历(Breath First Search)是图论中两种非常重要的算法,生产上广泛用于拓扑排序,寻路(走迷宫),搜索引擎,爬虫等,也频繁出现在高频面试题中。
35520 6
图文详解 DFS 和 BFS | 算法必看系列知识二十四
|
前端开发 Java 开发工具
Vue3 如何去开发安卓 或者 ios
Vue3 如何去开发安卓 或者 ios
241 0
|
开发者 Python
深入浅出Python协程:提高并发性能的秘诀
在现代软件开发中,提高应用程序的并发处理能力是一项挑战,尤其是在资源受限的情况下。本文将探讨Python协程的概念、原理及其在提高并发性能中的应用。通过对比传统多线程和多进程模型,我们将揭示Python协程如何以更少的资源消耗实现高效的并发任务处理。文章还将通过实例代码演示协程的创建、事件循环的管理以及异步编程的最佳实践,旨在为读者提供一种更轻量级、更高效的并发编程方法。
|
存储 分布式计算 算法
面试题:海量数据去重、Top-k、BitMap问题整理
首先直接进入正题,40亿QQ号如何设计算法去重,相同的QQ号码仅保留一个,内存限制为1个G。 (腾讯的QQ号都是4字节正整数,所以QQ号码的个数是43亿左右,理论值2^32-1个,又因为是无符号的,翻倍了一下,所以43亿左右)
面试题:海量数据去重、Top-k、BitMap问题整理
|
算法
【AcWing&&牛客】打表找规律
【AcWing&&牛客】打表找规律
165 0
|
Linux 开发工具
Buildroot系列开发(四)Linux工具链剖析(上)
Buildroot系列开发(四)Linux工具链剖析
232 0
Buildroot系列开发(四)Linux工具链剖析(上)
codeforces319——B. Psychos in a Line(思维+单调栈)
codeforces319——B. Psychos in a Line(思维+单调栈)
145 0
codeforces319——B. Psychos in a Line(思维+单调栈)
Codeforces Round #747 (Div. 2) D. The Number of Imposters(扩展域并查集 带权并查集)
Codeforces Round #747 (Div. 2) D. The Number of Imposters(扩展域并查集 带权并查集)
148 0
Codeforces 1263D.Secret Passwords(并查集 思维)
Codeforces 1263D.Secret Passwords(并查集 思维)
134 0
|
机器学习/深度学习
AtCoder Beginner Contest 218 C - Shapes (模拟)
AtCoder Beginner Contest 218 C - Shapes (模拟)
210 0

热门文章

最新文章