P9908 [COCI 2023/2024 #2] Pahuljice 题解

· · 题解

数据范围很小,考虑直接暴力枚举每个雪花中心,计算这个雪花的大小,然后更新答案。

怎么计算雪花的大小?从中心开始逐渐向外扩展,如果碰到边缘或者哪一圈的字符不符合雪花定义,就退出循环。

下面的代码为了看着清晰,有些内容被判断了多次,如 i-s>=0 就被判断了 3 次,不过没什么影响,编译器也会把它优化掉。

需要注意的是,因为 \ 是转义字符,所以要用 '\\' 表示字符 \

#include<bits/stdc++.h>
using namespace std;
char c[50][50]; 
int main(){
    ios::sync_with_stdio(false);
    int n,m;cin>>n>>m;
    for(int i=0;i<n;i++){
        cin>>c[i];
    }//输入
    int mx=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(c[i][j]=='+'){//如果是中心
                int x=0;
                for(int s=1;;s++){//向外扩展
                    if(i-s>=0&&j-s>=0&&c[i-s][j-s]=='\\'//左上
                     &&i-s>=0&&        c[i-s][j]=='|'   //上
                     &&i-s>=0&&j+s<m &&c[i-s][j+s]=='/' //右上
                     &&        j-s>=0&&c[i][j-s]=='-'   //左
                     &&        j+s<m &&c[i][j+s]=='-'   //右
                     &&i+s<n &&j-s>=0&&c[i+s][j-s]=='/' //左下
                     &&i+s<n &&        c[i+s][j]=='|'   //下
                     &&i+s<n &&j+s<m &&c[i+s][j+s]=='\\'//右下
                    ){
                        x++;
                    }else{
                        break;
                    }
                }
                mx=max(mx,x);
            }
        }
    }
    cout<<mx;
    return 0;
}