1 条题解

  • 0
    @ 2025-8-14 11:39:55

    版本质检员二代

    #include<bits/stdc++.h>
    using namespace std;
    char a[1001][1001];//存土地
    int dx[4]={0,0,1,-1};//方向数组
    int dy[4]={1,-1,0,0};//方向数组
    int n,m;
    bool check(int x,int y){
    	for(int i=0;i<4;i++){
    		int nx=x+dx[i],ny=y+dy[i];//康其他地方
    		if(nx<0||nx>n||ny<0||ny>m) continue;//是边缘,不判断
    		if(a[nx][ny]=='#') return 0;//有杂物,该罚
    	}
    	return 1;//过关!
    }
    
    int main(){
    	cin>>n>>m;//输入
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=m;j++){
    			cin>>a[i][j];//输入
    		}
    	}
    	int s=0;
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=m;j++){
    			if(a[i][j]=='.' && check(i,j)) s++;//算点的数量
    		}	
    	}
    	int maxx=-1e9;//擂台
    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=m;j++){
    			int t=0;//算开垦之后有几个子
    			if(a[i][j]=='#'){
    				a[i][j]='.';//开垦
    				if(check(i,j)) t++;
    				for(int k=0;k<4;k++){
    					int nx=i+dx[k],ny=j+dy[k];
    					if(nx<1||nx>n||ny<1||ny>m) continue;
    					if(a[nx][ny]=='.' && check(nx,ny)) t++;
    				}//同check函数
    				a[i][j]='#';//时间倒流
    			}
    			maxx=max(maxx,t);//擂台
    		}
    	}
    	cout<<s+maxx;//输出
    	return 0;//完美
    }
    • 1

    信息

    ID
    1345
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者