传送门:Oil Deposits - UVA 572 - Virtual Judge
题目详情:
输入:
输出:
Sample Input
Sample Output
代码实现
#include<stdio.h>
#include<string.h>
int vis[110][110], m, n, cnt;
char mp[110][110];
int next[8][2] = {-1,0, -1,1, 0,1, 1,1, 1,0, 1,-1, 0,-1, -1,-1};
void dfs(int x, int y) {
// vis[x][y] = 1;
int tx, ty;
for (int k = 0; k < 8; k++) {// 利用循环朝八个方向遍历
//更新变量
tx = x + next[k][0];
ty = y + next[k][1];
//判断边界
if (tx < 1 || tx > m || ty < 0 || ty >= n) continue;
// if (mp[x][y] == '*' || vis[x][y] != 0) continue;
// 这个点必须,没走过 ,并且是油田 ‘@ ’
if (!vis[tx][ty] && mp[tx][ty] == '@') {
vis[tx][ty] = 1;// 标记已经走过了
//向下一个点深搜
dfs(tx, ty);
}
}
return ;
}
int main() {
while (scanf("%d%d", &m, &n) && m && n) {
// getchar();
for(int i = 1; i <= m; i++) {
scanf("%s", mp[i]);// 说明后面要从 第 0 列开始遍历
}
//初始化记号数组 vis
memset(vis, 0, sizeof(vis));
cnt = 0;
for (int i = 1; i <= m; i++) {
for (int j = 0; j < n; j++) {//错误原因: 1,j应该从零开始,因为输入时一次输入一行 默认从第 0 列开始
if (!vis[i][j] && mp[i][j] == '@') {
// vis[i][j] = 1;
dfs(i, j);
cnt++;
}
}
}
printf("%d\n", cnt);
}
}