POJ1562

题意是在途中找@块的数量,算上斜方向的。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char a[110][110];
int vis[110][110];
int sizev = sizeof(vis);
int cou, m, n;
int dir[8][2] = {{1, 0}, {1, -1}, {0,1}, {0,-1}, {-1, 0}, {-1,1}, {1, 1}, {-1,-1}};   ///用数组存放上下左右选项

bool check(int x, int y) {
    if (x >= m || x < 0 || y >= n || y < 0 || vis[x][y]) return false;  ///越界与标记过的以后不再走
    return true;
}

void dfs(int x, int y) {
    int nx, ny;
    int i;
    for (i = 0; i < 8; i++) {      ///不要用if傻傻地穷举八个方向,代码量太大了
        nx = x + dir[i][0];
        ny = y + dir[i][1];

        if (!check(nx, ny)) continue;

        vis[nx][ny] = 1;   ///标记走过
        dfs(nx, ny);  ///dfs
    }
}

int main()
{
    int i, j;
    while (~scanf("%d%d", &m, &n) && m) {
        getchar();
        memset(vis, 0, sizev);
        for (i = 0; i < m; i++) {
            scanf("%s", a[i]);      ///这个数据用scanf("%c",&a[i][j]);有问题
            for (j = 0; j < n; j++) {
                if (a[i][j] == '*') vis[i][j] = 1;
            }
        }
#if 0
        for (i = 0; i < m; i++) {
            puts(a[i]);
        }
#endif // 1
        cou = 0;
        for (i = 0; i < m; i++) {
            for (j = 0; j < n; j++) {
                if (!vis[i][j]) {      ///遍历字符数组找到一个没有标记过的点开始DFS
                    vis[i][j] = 1;
                    dfs(i, j);
                    cou++;    ///每次搜完一块之后cou+1
                }
            }
        }

        printf("%d\n", cou);    ///打印出块数

    }
    return 0;
}


你可能感兴趣的:(算法,ACM,poj,DFS,深度搜索)