| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 
 | #include <bits/stdc++.h>#pragma GCC optimize(3)
 using namespace std;
 const int MaxN = 30;
 const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
 int n, m, c;
 int p[51];
 int a[MaxN][MaxN], tmp[MaxN][MaxN];
 inline int read()
 {
 int x = 0;
 char ch = getchar();
 while (ch > '9' || ch < '0')
 ch = getchar();
 while (ch <= '9' && ch >= '0')
 x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
 return x;
 }
 inline int calc(int A[30][30])
 {
 int ret = 0;
 for (int i = 1; i <= n; i++)
 {
 for (int j = 1; j <= m; j++)
 {
 for (int k = 0; k <= 3; k++)
 {
 int nx = i + dx[k], ny = j + dy[k];
 if (A[nx][ny] && (A[nx][ny] != A[i][j]))
 ++ret;
 }
 }
 }
 return ret / 2;
 }
 inline void init()
 {
 int now = 1, cnt = 0;
 for (int i = 1; i <= n; i++)
 {
 for (int j = 1; j <= m; j++)
 {
 a[i][j] = now;
 ++cnt;
 if (cnt == p[now])
 cnt = 0, now++;
 }
 }
 }
 inline void sa()
 {
 double t = 1.0, delta;
 if (n * m <= 400)
 delta = 0.9999900001;
 memcpy(tmp, a, sizeof(a));
 while (t > 1e-5)
 {
 std::pair<int, int> pos1, pos2;
 pos1.first = rand() % n + 1;
 pos2.first = rand() % n + 1;
 pos1.second = rand() % m + 1;
 pos2.second = rand() % m + 1;
 while (tmp[pos1.first][pos1.second] == tmp[pos2.first][pos2.second])
 {
 pos1.first = rand() % n + 1;
 pos2.first = rand() % n + 1;
 pos1.second = rand() % m + 1;
 pos2.second = rand() % m + 1;
 }
 std::swap(tmp[pos1.first][pos1.second], tmp[pos2.first][pos2.second]);
 int num = calc(tmp) - calc(a);
 if (num < 0)
 std::swap(a[pos1.first][pos1.second], a[pos2.first][pos2.second]);
 else if (exp(-num / t) * RAND_MAX > rand())
 std::swap(a[pos1.first][pos1.second], a[pos2.first][pos2.second]);
 else
 std::swap(tmp[pos1.first][pos1.second], tmp[pos2.first][pos2.second]);
 t *= delta;
 }
 }
 int main()
 {
 srand(107);
 n = read(), m = read(), c = read();
 for (int i = 1; i <= c; i++)
 p[i] = read();
 init();
 for (int i = 1; i <= 2; i++)
 sa();
 for (int i = 1; i <= n; i++)
 {
 for (int j = 1; j <= m; j++)
 printf("%d ", a[i][j]);
 puts("");
 }
 return 0;
 }
 
 |