CF1015E1 题解
思路
设 分别为从 开始向上、下、左、右方向延升出去的最长连续的星号,而以 表示 为中心能包含的最大星星大小, 其实就是 。然后暴力标记一下,如果有点是星号却没被标记就无解,否则对于每个 的都输出一次就行。
代码
# 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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?