油田 uva 572

高能预警:此文作者水平极差,漏洞百出,错误俯拾皆是,行文毫无逻辑!此文仅供作者自己研究所用。

所谓八连块没有什么神奇的,就是尽可能地把@字符连在一起,看能形成几块@的集合体。


#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;
}

感悟:

对于我们所要求的那个数,不一定是十分刻意的操作,比如用某个函数去求,而是在一系列操作中自然而然的得到这个结果。

以后再怎么样,不如试着先把主函数写出来,然后在一个个完善子函数。



猜你喜欢

转载自blog.csdn.net/huangming1644/article/details/79384667
今日推荐