您的位置:首页 > 其它

油田 uva 572

2018-02-27 10:28 197 查看
高能预警:此文作者水平极差,漏洞百出,错误俯拾皆是,行文毫无逻辑!此文仅供作者自己研究所用。 所谓八连块没有什么神奇的,就是尽可能地把@字符连在一起,看能形成几块@的集合体。
#include<cstdio>
#include<cstring>
using namespace std;

const int maxn = 100 + 5;
char pic[maxn][maxn];
int m, n, idx[maxn][maxn];

void dfs(int r, int c, int id) {
if(r < 0 || r >=m || c < 0 || c >= n) return;//小心越界的情况,也就是访问到非法空间
if(idx[r][c] > 0 || pic[r][c] != '@') return;//如果已经被打上连通分量编号或者那个地方符号不为@
idx[r][c] = id;//给它打上特有的标记
for(int dr = -1; dr <= 1; dr++)//d可以理解为delta,意思是变化的
for(int dc = -1; dc <= 1; dc++)
if(dr != 0 || dc != 0) dfs(r + dr, c + dc, id);/*要把自己这种情况排除在外,否则就会不停的循环下去?*/
}

int main() {
while(scanf("%d%d", &m, &n) == 2 && m && n) {//读入行数和列数,如果其中一个为零就停止。
for(int i = 0; i < m; i++) scanf("%s", pic[i]);//以行为单位读取字符串
memset(idx, 0,sizeof(idx));//每一种情况必须要执行一次清零操作
int cnt = 0;//把八连块的个数归零
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)//双重循环
if(idx[i][j] == 0 && pic[i][j] == '@') dfs(i, j, ++cnt);/*不妨以生化感染为例,一旦发现可被感染的@符号,它就会带上母体的一个特有编号并且把它遗传给它感染的后代*/
printf("%d\n", cnt);
}
return 0;
}
感悟: 对于我们所要求的那个数,不一定是十分刻意的操作,比如用某个函数去求,而是在一系列操作中自然而然的得到这个结果。 以后再怎么样,不如试着先把主函数写出来,然后在一个个完善子函数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: