Codeforces 616C The Labyrinth
2016-05-24 20:26
218 查看
题目链接:http://codeforces.com/problemset/problem/616/C
题意:给出n*m的矩阵,问和每一个‘*’连通的'.'有多少个(包括自己)
思路:每一个'.'连通块分配一个编号并求出连通块大小,每一个'*'号加上四周的连通块就好,注意去重
题意:给出n*m的矩阵,问和每一个‘*’连通的'.'有多少个(包括自己)
思路:每一个'.'连通块分配一个编号并求出连通块大小,每一个'*'号加上四周的连通块就好,注意去重
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; int n,m; char mp[1030][1030]; int num[1030][1030],val[1000030]; int chx[5]={1,0,-1,0},chy[5]={0,-1,0,1}; void dfs(int x,int y,int cnt) { if (num[x][y]!=0) return; num[x][y]=cnt; val[cnt]++; for (int i=0;i<4;i++) { int xx=x+chx[i]; int yy=y+chy[i]; if (xx<=0 || xx>n || yy<=0 || yy>m) continue; if (mp[xx][yy]=='*') continue; dfs(xx,yy,cnt); } return; } int main() { while (scanf("%d%d",&n,&m)!=EOF) { memset(val,0,sizeof(val)); memset(num,0,sizeof(num)); for (int i=1;i<=n;i++) scanf("%s",mp[i]+1); int cnt=1; for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) { if (mp[i][j]=='.' && num[i][j]==0) { dfs(i,j,cnt); cnt++; } } } for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) { if (mp[i][j]=='*') { int t[5]={0},res=0; t[0]=num[i+1][j]; t[1]=num[i][j+1]; t[2]=num[i-1][j]; t[3]=num[i][j-1]; sort(t,t+4); for (int i=0;i<4;i++) if (t[i]!=t[i+1]) res+=val[t[i]]; printf("%d",(res+1)%10); } else printf("."); } printf("\n"); } } }
相关文章推荐
- 简单的四则运算
- 数的奇偶性
- ACMer博客瀑布流分析
- ACM程序设计大赛题目分类
- 计算字符串最后一个单词长度
- ACM网址
- 1272 小希的迷宫
- 1272 小希的迷宫
- hdu 1250 大数相加并用数组储存
- 矩阵的乘法操作
- 蚂蚁爬行问题
- 蚂蚁爬行问题
- 求两个数的最大公约数【ACM基础题】
- 打印出二进制中所有1的位置
- 杭电题目---一只小蜜蜂
- HDOJ 1002 A + B Problem II (Big Numbers Addition)
- 初学ACM - 半数集(Half Set)问题 NOJ 1010 / FOJ 1207
- 初学ACM - 组合数学基础题目PKU 1833
- POJ ACM 1002
- POJ 2635 The Embarrassed Cryptographe