题解
(n^3)暴力,就是最暴力的那种( •̀ ▽ •́ )✧,枚举中心点和星星大小。咳咳,不是数据水,原题作者卡了好久这个方法,但是没能卡掉(辛苦了)。解释原因:可以发现,临近边缘的星星大小非常小,经过计算实际枚举次数(=4sumlimits_{i=1}^{frac{n+1}{2}}(n-2i+1)),省去常数后基本为(O(n^2))。
AC 代码
#include<bits/stdc++.h>
using namespace std;
const int N=1010;
struct node {int x,y,s;} ans[N*N];
char a[N][N];
bool vis[N][N];
int main()
{
int n,m,cnt=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%s",a[i]+1);
for(int i=2;i<n;i++)
{
for(int j=2;j<m;j++)
{
if(a[i][j]=='.') continue;
int t=1;
while(i>=t && j>=t && a[i+t][j]=='*' && a[i-t][j]=='*' && a[i][j+t]=='*' && a[i][j-t]=='*')
{vis[i+t][j]=vis[i-t][j]=vis[i][j+t]=vis[i][j-t]=1; t++;}
if(t<=1) continue;
ans[++cnt].x=i; ans[cnt].y=j;
ans[cnt].s=--t; vis[i][j]=1;
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(a[i][j]=='*' && !vis[i][j]) {printf("-1"); return 0; }
printf("%d
",cnt);
for(int i=1;i<=cnt;i++) printf("%d %d %d
",ans[i].x,ans[i].y,ans[i].s);
return 0;
}