CF1015E2 Solution

题目链接

题解

(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;
}

原文地址:https://www.cnblogs.com/violetholmes/p/14337405.html