本题大多数题解都是找最小值和最大值, 本蒟蒻觉得完全没有这么麻烦,范围只有10, 暴力枚举即可。 以下是本蒟蒻的代码:
#include<iostream>
using namespace std;
const int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
int n,m,f,ans,s,a,b,c,d;
char mp[51][51];
void print(){
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
cout<<mp[i][j];
}
cout<<endl;
}
}
int main() {
cin>>n>>m;
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
cin>>mp[i][j];
}
}
for (int i=1;i<=n;i++){
for (int j=1;j<=m;j++){
if (mp[i][j]=='X'){
f=0;
for (int k=0;k<4;k++){
int xx=i+dx[k],yy=j+dy[k];
if (mp[xx][yy]=='.'||xx>n||xx<1||yy<1||yy>m) f++;
}
if (f>=3) mp[i][j]='#';
else ans++;
}
}
}
a=1; b=1; c=n; d=m;
for (int sx=1;sx<=n;sx++){
for (int sy=1;sy<=m;sy++){
for (int ex=n;ex>=sx;ex--){
for (int ey=m;ey>=sy;ey--){
s=0;
for (int i=sx;i<=ex;i++){
for (int j=sy;j<=ey;j++){
if (mp[i][j]=='X') s++;
}
}
if (s==ans) {
a=sx; b=sy; c=ex; d=ey;
}
}
}
}
}
for (int i=a;i<=c;i++){
for (int j=b;j<=d;j++){
if (mp[i][j]=='#') cout<<'.';
else cout<<mp[i][j];
}
cout<<endl;
}
return 0;
}