Educational Codeforces Round 5 C. The Labyrinth
2016-01-23 18:34
274 查看
题目链接~~
题意:求矩阵中’*’为阻塞,’.’为空,求每个阻塞块相邻的连通块有多少空块
如下:
input
3 3
* . *
. * .
* . *
output
3.3
.5.
3.3
由于每个’*’都搜一次会超时,所以现将每个连通块都搜出来,并给每个‘.’所在的块标上块号,并记录每个块的‘.’数量。
题意:求矩阵中’*’为阻塞,’.’为空,求每个阻塞块相邻的连通块有多少空块
如下:
input
3 3
* . *
. * .
* . *
output
3.3
.5.
3.3
由于每个’*’都搜一次会超时,所以现将每个连通块都搜出来,并给每个‘.’所在的块标上块号,并记录每个块的‘.’数量。
#include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <cmath> #include <map> #include <set> #include <string> #include <vector> using namespace std; const int N=1005; char mp ; int cc ; int num[N*N]; bool vis ; int dx[]={0,0,1,-1}; int dy[]={1,-1,0,0}; int n,m; set<int>s; set<int>::iterator it; void dfs(int x,int y,int c){ cc[x][y]=c; num[c]++; for(int i=0;i<4;i++){ int xx=x+dx[i]; int yy=y+dy[i]; if(xx>=n||xx<0||yy<0||yy>=m) continue; if(cc[xx][yy]||mp[xx][yy]!='.') continue; vis[xx][yy]=1; dfs(xx,yy,c); } } int work(int x,int y){ s.clear(); int ans=0; for(int i=0;i<4;i++){ int xx=x+dx[i]; int yy=y+dy[i]; if(xx>=n||xx<0||yy<0||yy>=m) continue; if(mp[xx][yy]!='.') continue; s.insert(cc[xx][yy]); } for(it=s.begin();it!=s.end();it++){ int t=*it; ans+=num[t]; } return ans; } int main() { scanf("%d%d",&n,&m); for(int i=0;i<n;i++){ scanf("%s",mp[i]); } int c=1; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ if(cc[i][j]==0&&mp[i][j]=='.'){ num[c]=0; dfs(i,j,c); c++; } } } for(int i=0;i<n;i++) for(int j=0;j<m;j++){ if(mp[i][j]=='*'){ int ans=(work(i,j)+1)%10; mp[i][j]='0'+ans; } } for(int i=0;i<n;i++) printf("%s\n",mp[i]); }
相关文章推荐
- girlland
- Nandflash中的ECC原理及实现
- NetBeans找不到C/C++编译器
- POJ1008 Maya Calendar(模拟)&&整除和取余的边界问题
- leetcode204. Count Primes
- AMD加载器实现笔记(四)
- 移动Web开发图片自适应两种常见情况解决方案
- BWT (Burrows–Wheeler_transform) 解码分析
- linux redis安装
- 调用SwingUtilities.invokeLater()将更新UI的操作放到事件派发线程中执行
- 如何返回一个二维数组
- C语言:运行中获取宏名字的技巧
- 指针理解
- 最坏情况下,找到n个元素中第二小的元素需要(n-1)+(lgn向上取整+1)
- JavaScript跨域解决方法大全
- mysql的utf8mb4设置
- Shell脚本中参数传递方法常用有8种
- 变形空间和候选消除算法(Candidate-Elimination)C++实现
- Android SDK 在线更新镜像服务器资源
- 数字签名是什么?