问SA 82pts
  • 板块P3936 Coloring
  • 楼主liheyang123
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/18 12:31
  • 上次更新2024/10/18 13:36:49
查看原帖
问SA 82pts
534562
liheyang123楼主2024/10/18 12:31

!

#include<bits/stdc++.h>
using namespace std;
typedef long double ld;
const int N=60;
const ld BT=10000;
const ld ET=1e-8;
const ld CT=0.9999908;
const int dx[5]={0,1,-1,0,0};
const int dy[5]={0,0,0,1,-1};
int color[N][N];
int n,m,c;
int ans;

int get(int x1,int y1,int x2,int y2){
	int s1=0,s2=0,s3=0,s4=0;
	for(int i=1;i<=4;i++){
		int tx=x1+dx[i];
		int ty=y1+dy[i];
		if(tx<0||ty<0||tx>n||ty>m)continue;
		if(color[x1][y1]!=color[tx][ty])s1++;
	}
	for(int i=1;i<=4;i++){
		int tx=x2+dx[i];
		int ty=y2+dy[i];
		if(tx<0||ty<0||tx>n||ty>m)continue;
		if(color[x1][y1]!=color[tx][ty])s2++;
	}
	for(int i=1;i<=4;i++){
		int tx=x2+dx[i];
		int ty=y2+dy[i];
		if(tx<0||ty<0||tx>n||ty>m)continue;
		if(color[x2][y2]!=color[tx][ty])s3++;
	}
	for(int i=1;i<=4;i++){
		int tx=x1+dx[i];
		int ty=y1+dy[i];
		if(tx<0||ty<0||tx>n||ty>m)continue;
		if(color[x2][y2]!=color[tx][ty])s4++;
	}
	return ans-s1+s2-s3+s4;
}

void SA(){
	int tmp=ans;
    for(int T=BT;T>=ET;T*=CT){
        int ax,ay;
        int bx,by;
        do{
            ax=rand()%n+1,ay=rand()%m+1;
            bx=rand()%n+1,by=rand()%m+1;
        }while(ax==bx&&ay==by);
       // swap(color[ax][ay],color[bx][by]);
        int s=get(ax,ay,bx,by);
        int del=s-tmp;
        if(del<0){
        	ans=min(ans,s);
        	tmp=s;
        	swap(color[ax][ay],color[bx][by]);
		}else if(exp(-del/T)<rand()/RAND_MAX){
			tmp=s;
        	swap(color[ax][ay],color[bx][by]);
		}
    }
    if(clock()>=CLOCKS_PER_SEC*4.99){
        for(int i=1;i<=n;i++){
        	for(int j=1;j<=m;j++){
        		cout<<color[i][j]<<" ";
			}cout<<endl;
		}
        exit(0);
    }
}

int main(){
	srand(time(0));
    cin>>n>>m>>c;
    int C[N],zj=1;
    for(int i=1;i<=c;i++){
        cin>>C[i];
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            color[i][j]=zj;
            C[zj]--;
            while(C[zj]==0)zj++;
        }
    } 
	for(int i=1;i<n;i++){
        for(int j=1;j<m;j++){
            if(color[i][j]!=color[i+1][j])ans++;
            if(color[i][j]!=color[i][j+1])ans++;
        }
    } 
    while(1)SA();
    return 0;
}

板子,所以不打注释

2024/10/18 12:31
加载中...