本蒟蒻已经好久没做过这么简单的蓝题了
查看原帖
本蒟蒻已经好久没做过这么简单的蓝题了
650565
yanglang1楼主2024/9/6 11:31

二十分钟打完后好开心, 因为好久没做过这么简单的模拟题了, 看到评论区有人140行代码后有震惊到QwQ,但这也是重构过的代码,枚举墙还是很清晰

#include<bits/stdc++.h>
using namespace std;
const int N = 55, NN = 2505;
int n, m;
bool W[N][N], E[N][N], S[N][N], Nor[N][N];
int fi[N][N], si[NN], tot, maxi, maxia, mx, my;
char fx;
void f(int x, int y){
    fi[x][y] = tot;
    si[tot]++;
    if(si[tot] > maxi) maxi = si[tot];
    if(!W[x][y] && !fi[x][y-1])f(x, y-1);
    if(!E[x][y] && !fi[x][y+1])f(x, y+1);
    if(!S[x][y] && !fi[x+1][y])f(x+1, y);
    if(!Nor[x][y] && !fi[x-1][y])f(x-1, y);
    return ;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> m >> n;
    for(int i=1;i<=n;i++){
        for(int j=1,xb;j<=m;j++){
            cin >> xb;
            W[i][j]=(xb & 1);
            Nor[i][j]=(xb & 2);
            E[i][j]=(xb & 4);
            S[i][j]=(xb & 8);
        }
    }
    for(int i=n;i>=1;i--){
        for(int j=1;j<=m;j++){
            if(!fi[i][j]){
                tot++;
                f(i, j);
            }
        }
    }
    for(int j=1, ot;j<=n;j++){
        for(int i=n;i>=1;i--){     
            if(Nor[i][j] && fi[i][j] != fi[i-1][j] ){
                ot = si[fi[i][j]] + si[fi[i-1][j]];
                if(ot > maxia){
                    maxia = ot;
                    fx = 'N';
                    mx = i, my = j;
                }
            }
            if(E[i][j] && fi[i][j] != fi[i][j+1] ){
                ot = si[fi[i][j]] + si[fi[i][j+1]];
                if(ot > maxia){
                    maxia = ot;
                    fx = 'E';
                    mx = i, my = j;
                }
            }
        }
    }
    cout << tot << "\n" << maxi << "\n" << maxia << "\n" << mx << " " << my << " " << fx ;
    return 0;
}
2024/9/6 11:31
加载中...