标签:ons problems sum continue code scanf targe set 就是
\(n^3\)暴力,就是最暴力的那种( ?? ▽ ?? )?,枚举中心点和星星大小。咳咳,不是数据水,原题作者卡了好久这个方法,但是没能卡掉(辛苦了)。解释原因:可以发现,临近边缘的星星大小非常小,经过计算实际枚举次数\(=4(n-1)\cdot\sum\limits_{i=1}^{\frac{n}{2}}\frac{i}{2^i}(+\frac{n}{2},n为奇时)\)。因为当\(i\)很大时,\(\frac{i}{2^i}\)是很小的,因此实际复杂度远达不到\(O(n^3)\)。
#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\n",cnt);
for(int i=1;i<=cnt;i++) printf("%d %d %d\n",ans[i].x,ans[i].y,ans[i].s);
return 0;
}
标签:ons problems sum continue code scanf targe set 就是
原文地址:https://www.cnblogs.com/violetholmes/p/14337405.html