0
点赞
收藏
分享

微信扫一扫

油田问题(Oil Deposits)(DFS 处理连通块)

Python百事通 2022-01-12 阅读 38

传送门: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);
	}
}

举报

相关推荐

0 条评论