80 pts 求调
查看原帖
80 pts 求调
1112264
YZZCDS楼主2025/7/28 13:41
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

inline ll read() {
	ll f = 1, x = 0;
	char ch = getchar();
	while (ch < '0' || ch > '9') {
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = x * 10 + ch - '0';
		ch = getchar();
	}
	return x * f;
}

inline void write(ll x) {
	if (x < 0) x = -x, putchar('-');
	if (x > 9) write(x/10);
	putchar('0'+x%10);
}

inline void writeln(ll x) {
	write(x);
	putchar('\n');
}

#define id(i, j) ((i)-1)*m+(j)

struct edge {
	ll v, next;
} e[40005];
ll head[3605], cnt;

void add_edge(ll u, ll v) {
	e[++cnt] = {v, head[u]};
	head[u] = cnt;
}

ll T, n, m;
bool mp[65][65];

ll dfn[3605];
ll low[3605];
bool isCut[3605], hasCut;
ll tot, num;

void tarjan(ll u, bool root) {
	dfn[u] = low[u] = ++tot;
	ll child = 0;
	for (int i = head[u]; i; i = e[i].next) {
		ll v = e[i].v;
		if (!dfn[v]) {
			tarjan(v, 0);
			low[u] = min(low[u], low[v]);
			if (low[v] >= dfn[u] && !root) 
				isCut[u] = hasCut = 1;
			if (root) child ++;
		} else low[u] = min(low[u], dfn[v]);
	}
	if (root && child >= 2) isCut[u] = hasCut = 1;
}

int main() {
	T = read();
	while (T --) {
		memset(e, 0, sizeof(e));
		memset(head, 0, sizeof(head));
		cnt = 0;
		memset(mp, 0, sizeof(mp));
		memset(dfn, 0, sizeof(dfn));
		memset(low, 0, sizeof(low));
		memset(isCut, 0, sizeof(isCut));
		tot = 0;
		num = 0;
		hasCut = false;
		n = read(), m = read();
		for (int i = 1; i <= n; i ++) {
			for (int j = 1; j <= m; j ++) {
				char c;
				cin >> c;
				mp[i][j] = (c == 'G');
				num += mp[i][j];
			}
		}
		if (num <= 2) {
			writeln(-1);
			continue;
		}
		for (int i = 1; i <= n; i ++) {
			for (int j = 1; j <= m; j ++) {
				if (!mp[i][j]) continue;
				if (i != 1 && mp[i-1][j]) // up
					add_edge(id(i, j), id(i-1, j));
				if (i != n && mp[i+1][j]) // down
					add_edge(id(i, j), id(i+1, j));
				if (j != 1 && mp[i][j-1]) // left
					add_edge(id(i, j), id(i, j-1));
				if (j != m && mp[i][j+1]) // right
					add_edge(id(i, j), id(i, j+1));
			}
		}
		num = 0;
		for (int i = 1; i <= n; i ++) {
			for (int j = 1; j <= m; j ++) {
				if (mp[i][j] && !dfn[id(i, j)]) {
					tarjan(id(i, j), 1);
					num ++;
				}
			}
		}
		if (num >= 2) {
			writeln(0);
		} else if (hasCut) {
			writeln(1);
		} else {
			writeln(2);
		}
	}
	return 0;
}
2025/7/28 13:41
加载中...