二十分钟打完后好开心, 因为好久没做过这么简单的模拟题了, 看到评论区有人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;
}