【Codeforce 1461B】 Find the Spruce

传送门

题意

给定一个字符串矩阵,如果是符号*,每个组成三角形状的都算做一个树,统计数量

数据范围

\(1\leq t\leq 10\)
\(1\leq n,m\leq 500\)

题解

树的形状一定是三角形的,其中每个单独的点也算一种,枚举每个点作为三角形头,统计数量即可
时间复杂度\(O(n^{3})\)

Code

#include<bits/stdc++.h>
using namespace std;
const int N=510;
char s[N][N];
int sum[N][N];

void solve(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>s[i]+1;
    for(int i=1;i<=n;i++) 
        for(int j=1;j<=m;j++){
            sum[i][j]=sum[i][j-1];
            if(s[i][j]=='*') sum[i][j]++;
    } 
    int res=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            for(int k=1;;k++){ 
                int lv=i+k-1,l=j-k+1,r=j+k-1;
                if(lv<=n && l>=1 && r<=m && sum[lv][r]-sum[lv][l-1]==r-l+1) res++;
                else break;
            }
    cout<<res<<endl;
}
int main(){
    int _;cin>>_;
    while(_--) solve();
}

posted @ 2020-12-16 22:04  Hyx'  阅读(71)  评论(0)    收藏  举报