CodeForce 377 A mazes (逆向思维)
2016-03-12 17:50
387 查看
题意:
给一个n*m的矩阵,#代表墙,.代表通路,给一个k值,代表需要你将矩阵中k个通路改为X,但是要保证剩下的点依然联通,然后输出改变有的矩阵。
分析:
因为原图是连通的,我们队原图进行递归深搜,从深搜树的底部开始往上删除结点,直至k等于0,这样既达到了删除k个节点也保证了剩余的节点连续。
给一个n*m的矩阵,#代表墙,.代表通路,给一个k值,代表需要你将矩阵中k个通路改为X,但是要保证剩下的点依然联通,然后输出改变有的矩阵。
分析:
因为原图是连通的,我们队原图进行递归深搜,从深搜树的底部开始往上删除结点,直至k等于0,这样既达到了删除k个节点也保证了剩余的节点连续。
#include <cstdio> #include <iostream> #include <cstring> #include <string> #include <cstdlib> #include <algorithm> #include <cmath> #include <vector> #include <set> #include <list> #include <queue> #include <map> using namespace std; char mp[550][550],vis[550][550]; int n,m,k; int mx[4] = {0,0,1,-1}; int my[4] = {1,-1,0,0}; void dfs(int x,int y) { for(int i = 0; i < 4; i++) { int sx = x + mx[i]; int sy = y + my[i]; if(sx < 0 || sx >= n || sy < 0 || sy >= m) continue; if(vis[sx][sy] || mp[sx][sy] == '#') continue; vis[sx][sy] = 1; dfs(sx,sy); } if(k) { mp[x][y] = 'X'; k--; } } int main() { int t,C = 1; //scanf("%d",&t); while(scanf("%d%d%d",&n,&m,&k) != EOF) { memset(vis,0,sizeof(vis)); for(int i = 0; i < n; i++) scanf("%s",mp[i]); int k = 0; for(int i = 0; i < n; i++) { for(int j = 0; j < m; j++) { if(mp[i][j] == '.') { vis[i][j] = 1; dfs(i,j); k = 1; break; } } if(k) break; } for(int i = 0; i < n; i++) printf("%s\n",mp[i]); } }
相关文章推荐
- 原型继承名词解释
- 四则运算2及PSP0设计项目计划
- 第三周项目3-输出星号图(e)
- Linus,一生只为寻找欢笑
- angular 语法笔记
- Design库,全部控件的使用
- 代码健壮性--异常处理中try catch finall throw throws五个关键字学习
- Bias and Variance
- Linux基础指令
- C++ string 类型提取字符串
- Ladder network 优势与实现步骤
- Firemonkey访问iOS的钥匙串Keychain
- jdk1.8新特性详解
- MySQL常用基本操作
- Tyvj P1463 智商问题 分块
- 四则运算二
- C++ string 类型提取字符串
- mvchelper
- CF 593 A 2Char(选择合适的枚举方式)
- CF #622C. Not Equal on a Segment