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

· · 题解

为了对雪花进行判断,我们需要找到给出的字符矩阵中的 + 字符,然后从这一位置开始向外扩展即可。扩展的方法如下:

对于每一个 + 字符的所在位置 (i,j),用 x 变量表示当前雪花的大小。这样,雪花最外面的需要判断的位置就是 (i\pm x,j)(上下)、(i,j\pm x)(左右)、(i\pm x,j\pm x)(左上和右下)、(i\pm x,j\mp x)(左下和右上)。如果这些位置均未越界且都符合题目中所给的条件,则证明当前可以构成雪花,进行 x\gets x+1 操作后继续循环;否则证明当前构不成雪花,雪花的大小比当前的 x1,因此跳出循环,进行 x\gets x-1 操作,然后用 x 更新答案。

#include<bits/stdc++.h>
using namespace std;
int n,m;
bool pos_valid(int x,int y){ //判断坐标是否合法
    return 1<=x&&x<=n&&1<=y&&y<=m;  
}
char sn[55][55];
int main(){
    cin >> n >> m;
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++){
            cin >> sn[i][j];
        }
    }
    int ans = 0;
    for(int i = 1;i <= n;i++){
        for(int j = 1;j <= m;j++){
            if(sn[i][j]=='+'){
                int x = 1;
                while(pos_valid(i-x,j-x)&&pos_valid(i-x,j+x)&&pos_valid(i+x,j-x)&&pos_valid(i+x,j+x)&&
                (sn[i][j-x]=='-'&&sn[i][j+x]=='-'&&sn[i-x][j]=='|'&&sn[i+x][j]=='|'&&sn[i-x][j-x]=='\\'&&sn[i+x][j+x]=='\\'&&sn[i+x][j-x]=='/'&&sn[i-x][j+x]=='/')){
                    x++;
                }
                x--; //最后一次x++之后是不能构成雪花的,因此要减去
                ans = max(ans,x);
            }
        }
    }
    cout << ans;
}