!
#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;
}
板子,所以不打注释