2023年天梯赛补题(待补充)

发布时间 2023-04-23 21:21:59作者: oddpointa

2023年天梯赛

摆烂局,又卡dfs的图存储上,还是补题太少了,这么好的骗分比赛,一分都没骗着。好好训练,争取西安站学校能出线。恶补一下树和数学。多存点板子。

L2-4 寻宝图 25 3516/35325(9.95%)

题目

给定一幅地图,其中有水域,有陆地。被水域完全环绕的陆地是岛屿。有些岛屿上埋藏有宝藏,这些有宝藏的点也被标记出来了。本题就请你统计一下,给定的地图上一共有多少岛屿,其中有多少是有宝藏的岛屿。

输入格式:
输入第一行给出 2 个正整数 N 和 M(1<N×M≤10^5),是地图的尺寸,表示地图由 N 行 M 列格子构成。随后 N 行,每行给出 M 位个位数,其中 0 表示水域,1 表示陆地,2-9 表示宝藏。
注意:两个格子共享一条边时,才是“相邻”的。宝藏都埋在陆地上。默认地图外围全是水域。

输出格式:
在一行中输出 2 个整数,分别是岛屿的总数量和有宝藏的岛屿的数量。

思路

裸dfs题(bfs也可以)+双重vector

代码

#include <bits/stdc++.h>
using namespace std;
#define PII pair<int, int>
int n, m, k, T, t, _;
vector<vector<char> > g;
vector<vector<bool> > vis;


int cnt = 0, treasure = 0;
bool f = 0;

int dx[] = {0, 0, -1, 1};

int dy[] = {1, -1, 0, 0};

void dfs(int x, int y) {
	if (g[x][y] > '1')
		f = 1;
	g[x][y] = '0';//找到后就置0
	for (int i = 0; i < 4; i++) {
		int nx = x + dx[i], ny = y + dy[i];
		if (g[nx][ny] > '0' && nx >= 0 && nx < n && ny >= 0 && ny <= m) {
			dfs(nx, ny);
		}
	}
	return ;
}


int main() {
	cin >> n >> m;
	vector<vector<char> > a(n + 1, vector<char> (m + 1));
	vector<vector<bool> > v(n + 1, vector<bool> (m + 1));
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			cin >> a[i][j];
	g = a;
	vis = v;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {

			if (g[i][j] != '0') {
				cnt++;
				dfs(i, j);
				if (f == 1) {
					treasure++;
					f = 0;
				}
			}
		}

	}
	cout << cnt << " " << treasure << endl;
	return 0;
}