申请添加题解(违规紫砂)
查看原帖
申请添加题解(违规紫砂)
1407930
chenboyu178002766楼主2025/1/23 10:21

本题大多数题解都是找最小值和最大值, 本蒟蒻觉得完全没有这么麻烦,范围只有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;
}
2025/1/23 10:21
加载中...