Tägliche Frage zum Blue Bridge Cup 2023.9.11

Lanqiao Cup 2023 14. Provinzwettbewerb Echte Fragen – Anzahl der Inseln – C Language Network (dotcpp.com)

Beschreibung der Frage

Xiaolan erhielt eine Gitterkarte der Größe M × N, die als zweidimensionales Array betrachtet werden kann, das nur die Zeichen „0“ (für Meerwasser) und „1“ (für Land) enthält. Die Außenseite der Karte kann betrachtet werden Da es sich bei allen um Meerwasser handelt und jede Insel durch die Verbindung benachbarter Einsen in den vier Richtungen oben/unten/links/rechts gebildet wird.

Wenn in dem von Insel A besetzten Gitter k verschiedene Gitter ausgewählt werden können, können deren Koordinaten eine Anordnung wie diese bilden: (x0, y0), (x1, y1), ..., (xk− 1, yk− 1), wobei (x(i+1)%k , y(i+1)%k) erhalten wird, indem (xi , yi) einmal nach oben/unten/links/rechts bewegt wird (0 ≤ i ≤ k − 1),

Zu diesem Zeitpunkt bilden diese k Gitter einen „Ring“. Wenn alle von einer anderen Insel B besetzten Gitter innerhalb dieses „Rings“ liegen, betrachten wir Insel B als Unterinsel von Insel A. Wenn B eine Unterinsel von A und C eine Unterinsel von B ist, dann ist C auch eine Unterinsel von A.

Wie viele Inseln gibt es insgesamt auf dieser Karte? Bei der Erstellung von Statistiken ist es nicht erforderlich, die Anzahl der Unterinseln zu zählen.

analysieren

Wir können über die Frage nachdenken: Welche Inseln benötigen wirklich Statistiken? Das ist die Insel, die direkt mit dem äußersten Meer verbunden werden kann. Wir können DFS vom äußersten Meer aus durchführen. Wenn es „0“ ist, bedeutet dies, dass es immer noch ein Meer ist. Es kann als besucht markiert werden. Wenn es „ 1' bedeutet, dass sie besucht wurde. Dies ist eine Insel. Sie können ein weiteres BFS auf dieser Insel durchführen und diese durchquerten Inseln auf „true“ setzen. Die endgültige Antwort ist die Anzahl dieser mit dem Meer verbundenen Inseln.

#include<bits/stdc++.h>
using namespace std;
const int N = 1e4 + 10;
typedef pair<int, int> PII;
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
int dx1[8] = {-1, -1, -1, 0, 1, 1, 1, 0};
int dy1[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
int n, m, t, cnt;
bool v[N][N];
char g[N][N];
queue<PII> q;
void bfs(int x, int y)
{
	queue<PII> q;
	q.push({x, y});
	v[x][y] = true;
	while(q.size())
	{
		auto t = q.front();
		q.pop();
		for(int i = 0; i < 4; i ++)
		{
			int a = t.first + dx[i];
			int b = t.second + dy[i];
			if(a >= 0 && a <= n + 1 && b >= 0 && b <= m + 1 && g[a][b] == '1' && !v[a][b])
			{
				v[a][b] = true;
				q.push({a, b});
			}
		}
	}
}
void bfs1(int x, int y)
{
	queue<PII>q;
	q.push({x, y});
	v[x][y] = true;
	while(q.size())
	{
		auto t = q.front();
		q.pop();
		for(int i = 0; i < 8; i ++)
		{
			int a = t.first + dx1[i];
			int b = t.second + dy1[i];
			if(a >= 0 && a <= n + 1 && b >= 0 && b <= m + 1 && !v[a][b])
			{
				if(g[a][b] == '1')
				{
					cnt ++;
					bfs(a, b);
				}
				else
				{
					q.push({a, b});
					v[a][b] = true;
				}
			}
		}
	}
}
void solve()
{
	cnt = 0;
	cin >> n >> m;
	memset(g, '0', sizeof g);
	memset(v, 0, sizeof v);
	for(int i = 1; i <= n; i ++)
	{
		for(int j = 1; j <= m; j ++)
		{
			cin >> g[i][j];
		}
	}
	bfs1(0, 0);
	cout << cnt << '\n';
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	cin >> t;
	while(t --)
	{
		solve();
	}
	return 0;
}

Guess you like

Origin blog.csdn.net/m0_75087931/article/details/132812763