您的位置:首页 > 其它

uva572 油田 连通块遍历

2016-08-06 11:55 369 查看
代码的简洁性需要注意小技巧:

1. 方向数组。

2. 外面包一层空气防止判断边界。

3. 更改原来的数组的状态而不需要重新建立vis数组

(这样会破坏原始数据,是一个不好的习惯,但是这样很灵活。)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19435

#include <stdio.h>
#include <memory.h>

#define DIRECTSIZE 8

struct direct {
int drow;
int dcol;
} direct[DIRECTSIZE] =
{{0, -1}, {0, 1}, {-1, 0}, {1, 0}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};

#define MAXN 100

char grid[MAXN+2][MAXN+2];

void dfs(int row, int col)
{
int i;

for(i=0; i<DIRECTSIZE; i++) {
int nextrow = row + direct[i].drow;
int nextcol = col + direct[i].dcol;

if(grid[nextrow][nextcol] == '@') {
grid[nextrow][nextcol] = '*';

dfs(nextrow, nextcol);
}
}
}

int main(void)
{
int m, n, count, i, j;

while(scanf("%d%d", &m, &n) != EOF) {
// 判定结束条件
if(m == 0 && n == 0)
break;

// 清零:边界清零
memset(grid, 0, sizeof(grid));

// 读入数据
for(i=1; i<=m; i++)
scanf("%s", grid[i]+1);

// 计数清零
count = 0;

// 深度优先搜索
for(i=1; i<=m; i++)
for(j=1; j<=n; j++)
if(grid[i][j] == '@') {
count++;
grid[i][j] = '*';
dfs(i, j);
}

// 输出结果
printf("%d\n", count);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  uva572 图论