枚举每个可以换杂物的点
2026-08-26 14:37:01
发布于:山东
此题要枚举所有可以换成杂物的位置;为了减少时间复杂度,可以先把这个位置存起来;
对于每个更换的点,算算,使周边可以开垦的地点,变成不能开肯的点,最多的几个;
#include<bits/stdc++.h>
using namespace std;
int n,m,ans=0,dx[5]={0,0,0,1,-1},dy[5]={0,1,-1,0,0},ma;
char c[1005][1005];
queue<pair<int,int>>q;
bool fuhe(int x,int y){
if(c[x][y+1]'#'||c[x+1][y]'#'||c[x][y-1]'#'||c[x-1][y]'#')return false;
else return true;
}
void f(){
int t=q.size();
int cnt=0;
while(t--){
int x=q.front().first,y=q.front().second;
q.pop();
c[x][y]='.';
cnt=0;
for(int i=0;i<=4;i++){//更换每个杂物,看否让周边开垦数量减少
int xx=x+dx[i],yy=y+dy[i];
if(c[xx][yy]'.'&&fuhe(xx,yy))cnt++;
}
ma=max(ma,cnt); //求数减少的最大量;
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>c[i][j];
if(c[i][j]'.')q.push({i,j});//记录每个可以加杂物的点;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(c[i][j]=='.'){
if(fuhe(i,j)){
ans++;//查出总数;
}
}
}
}
f();
cout<<ans-ma;
return 0;
}
这里空空如也





有帮助,赞一个