60分,BFS加贪心加并查集求调
查看原帖
60分,BFS加贪心加并查集求调
778975
QAQ_YTH楼主2024/12/26 21:37

思路:能走一步是一步,从++开始搜

没过样例

#include<bits/stdc++.h>
using namespace std;
const int N=11;
const int vx[5]= {0,1,0,-1,0},vy[5]= {0,0,-1,0,1};
int n,m,ans,f[N][N],flag,k=1;
queue< pair<int,int> >q;
map<pair<int,int>,pair<int,int>>vis;
pair<int,int> find(pair<int,int>k){
	int x=k.first,y=k.second;
	if(vis[{x,y}].first==x && vis[{x,y}].second==y){
		return {x,y};
	}else return vis[{x,y}]=find(vis[{x,y}]);
}
void unin(pair<int,int>a,pair<int,int>b){
	pair<int,int>fa=find(a);
	pair<int,int>fb=find(b);
	if(fa!=fb){
		vis[fa]=fb;
		return;
	}
}
char ch;
int main() {
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			cin>>ch;
			vis[{i,j}]={i,j};
			if(ch=='+') {
				f[i][j]=2;
				
				q.push(pair<int,int> {i,j});
			} else if(ch=='#') {
				f[i][j]=1;
			} else {
				f[i][j]=0;
			}
		}
	}
	/*for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			printf("{%2d,%2d}  ",vis[{i,j}].first,vis[{i,j}].second);
		}
		puts("");
	}
	puts("");*/
	while(!q.empty()) {
		int x=q.front().first;
		int y=q.front().second;
		q.pop();
		if(f[x][y]==1)continue;
		map<pair<int,int>,int>ma;
		pair<int,int>num;
		int cnt=0,sum=0,last;
		for(int i=1; i<=4; i++) {
			int nx=x+vx[i],ny=y+vy[i];
			if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&f[nx][ny]==2){
				cnt++;
				last=f[nx][ny];
				num={nx,ny};
				if(ma[find(vis[{nx,ny}])]==0)ma[find(vis[{nx,ny}])]=1,sum++;
			}
			
		}
		if(cnt<=sum) {
			unin(num,{x,y});
			f[x][y]=last;
			ans++;
			f[x][y]=2;
			for(int i=1; i<=4; i++) {
				int nx=x+vx[i],ny=y+vy[i];
				if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&f[nx][ny]==0)q.push(pair<int,int> {nx,ny});
				if(ma[find(vis[{nx,ny}])]==1)ma[find(vis[{nx,ny}])]=0,unin({nx,ny},{x,y});
			}
		}
	}
	/*for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			printf("{%2d,%2d}  ",vis[find({i,j})].first,vis[find({i,j})].second);
		}
		puts("");
	}*/
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			if(f[i][j]==1)cout<<"#";
			if(f[i][j]==2)cout<<"+";
			if(f[i][j]==0)cout<<".";
		}
		puts("");
	}
	return 0;
}
2024/12/26 21:37
加载中...