CF1015E1 题解

思路

ui,j,di,j,li,j,ri,ju_{i,j},d_{i,j},l_{i,j},r_{i,j} 分别为从 ai,ja_{i,j} 开始向上、下、左、右方向延升出去的最长连续的星号,而以 si,js_{i,j} 表示 ai,ja_{i,j} 为中心能包含的最大星星大小,si,js_{i,j} 其实就是 min(ui,j,di,j,li,j,ri,j)\min(u_{i,j},d_{i,j},l_{i,j},r_{i,j})。然后暴力标记一下,如果有点是星号却没被标记就无解,否则对于每个 si,j>0s_{i,j}>0 的都输出一次就行。

代码

# include <bits/stdc++.h>
using namespace std;
int n, m, l[105][105], r[105][105], u[105][105], d[105][105], sum[105][105], ans;
string a[105];
bitset <105> vis[105];
int main () {
	ios::sync_with_stdio (0);
	cin.tie (0);
	cout.tie (0);
	cin >> n >> m;
	for (int i = 1; i <= n; ++ i) {
		cin >> a[i];
		a[i] = '*' + a[i];
		for (int j = 1; j <= m; ++ j)
			if (a[i][j] == '*')
				l[i][j] = l[i][j - 1] + 1, u[i][j] = u[i - 1][j] + 1;
	}
	for (int i = n; i; -- i)
		for (int j = m; j; -- j)
			if (a[i][j] == '*') {
				r[i][j] = r[i][j + 1] + 1;
				d[i][j] = d[i + 1][j] + 1;
				sum[i][j] = min ({l[i][j], r[i][j], u[i][j], d[i][j]}) - 1;
				if (sum[i][j]) {
					++ ans;
					for (int x = i - sum[i][j]; x <= i + sum[i][j]; ++ x)
						vis[x][j] = 1;
					for (int y = j - sum[i][j]; y <= j + sum[i][j]; ++ y)
						vis[i][y] = 1;
				}
			}
	for (int i = 1; i <= n; ++ i)
		for (int j = 1; j <= m; ++ j)
			if (a[i][j] == '*' && ! vis[i][j]) {
				cout << -1;
				return 0;
			}
	cout << ans << '\n';
	for (int i = 1; i <= n; ++ i)
		for (int j = 1; j <= m; ++ j)
			if (sum[i][j])
				cout << i << ' ' << j << ' ' << sum[i][j] << '\n';
	return 0;
}
posted @   sz_jinzikai  阅读(0)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示