POJ1562

来源:互联网 发布:代金券数据库设计 编辑:程序博客网 时间:2024/06/01 10:50

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

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


0 0
原创粉丝点击