不知道怎么优化了,卡在了 92 分。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define RM 25
#define IMAX 0x3f3f3f3f
typedef int I;
typedef char C;
#define SWAP(T, a, b) { T _t = a; a = b; b = _t; }
I taboo[RM][RM][RM][RM];
I value[RM][RM][RM][RM];
I ans, cur;
I seq[RM][RM], prog[RM][RM], pi[55];
I n, m, c;
I check(void)
{
I ret = 0;
for (I i = 1; i <= n; i++)
{
for (I j = 1; j < m; j++)
{
ret += seq[i][j] != seq[i][j + 1];
}
}
for (I i = 1; i < n; i++)
{
for (I j = 1; j <= m; j++)
{
ret += seq[i][j] != seq[i + 1][j];
}
}
return ret;
}
void TS(void)
{
for (I t = 1; t <= 120; t++)
{
I bestxa = 0, bestxb = 0, bestya = 0, bestyb = 0;
I best = IMAX;
for (I i = 0; i < n * m; i++)
{
for (I j = i + 1; j < n * m; j++)
{
I xa = i / m + 1, xb = i % m + 1;
I ya = j / m + 1, yb = j % m + 1;
if (seq[xa][xb] == seq[ya][yb]) continue;
SWAP(I, seq[xa][xb], seq[ya][yb]);
I res = check();
if (res < best && (t - taboo[xa][xb][ya][yb] > n * m / 3
|| res > value[xa][xb][ya][yb]))
{
best = res;
bestxa = xa, bestxb = xb, bestya = ya, bestyb = yb;
}
SWAP(I, seq[xa][xb], seq[ya][yb]);
}
}
taboo[bestxa][bestxb][bestya][bestyb] = t;
value[bestxa][bestxb][bestya][bestyb] = best;
SWAP(I, seq[bestxa][bestxb], seq[bestya][bestyb]);
if (best < ans)
{
ans = best;
memcpy(prog, seq, sizeof(seq));
}
}
}
int main(void)
{
scanf("%d%d%d", &n, &m, &c);
for (I i = 1; i <= c; i++)
{
scanf("%d", &pi[i]);
}
I cur = 1;
for (I i = 1; i <= n; i++)
{
for (I j = 1; j <= m; j++)
{
if (pi[cur] == 0) cur++;
pi[cur]--;
seq[i][j] = cur;
}
}
ans = IMAX;
TS();
for (I i = 1; i <= n; i++)
{
for (I j = 1; j <= m; j++)
{
printf("%d ", prog[i][j]);
}
printf("\n");
}
return 0;
}