cf 1015 E2. Stars Drawing (Hard Edition)

先预处理出来所有点所对应的上下左右各有多少*,再用两个差分数组,一个横向一个纵向,来还原最多可以填满的网格

#include<bits/stdc++.h>
using namespace std;
char graph[1010][1010];
int up[1010][1010];
int dn[1010][1010];
int ri[1010][1010];
int le[1010][1010];
int judgex[1010][1010];
int judgey[1010][1010];
int judge[1010][1010];
struct ans{
    int x,y,l;
};
vector<ans> vec;
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        getchar();
        for(int j=1;j<=m;j++)
        {
            scanf("%c",&graph[i][j]);
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(graph[i][j]=='*')
            {
                up[i][j]=up[i-1][j]+1;
                le[i][j]=le[i][j-1]+1;
            }
        }
    }
    for(int i=n;i>=1;i--)
    {
        for(int j=m;j>=1;j--)
        {
            if(graph[i][j]=='*')
            {
                dn[i][j]=dn[i+1][j]+1;
                ri[i][j]=ri[i][j+1]+1;
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(graph[i][j]=='*')
            {
                int index=min(min(up[i][j]-1,dn[i][j]-1),min(ri[i][j]-1,le[i][j]-1));
                if(index>0)
                {
                    ans now;
                    now.x=i;
                    now.y=j;
                    now.l=index;
                    vec.push_back(now);
                    judgex[i-index][j]++;
                    judgex[i+index+1][j]--;
                    judgey[i][j-index]++;
                    judgey[i][j+index+1]--;
                }
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            judgex[i][j]+=judgex[i-1][j];
            judgey[i][j]+=judgey[i][j-1];
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            judge[i][j]=judgex[i][j]+judgey[i][j];
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(graph[i][j]=='*'&&judge[i][j]==0)
            {
                printf("-1\n");
                return 0;
            }
        }
    }
    printf("%d\n",vec.size());
    for(int i=0;i<vec.size();i++)
    {
        printf("%d %d %d\n",vec[i].x,vec[i].y,vec[i].l);
    }
}

猜你喜欢

转载自www.cnblogs.com/lishengkangshidatiancai/p/10287317.html
今日推荐