有谁会写 禁忌搜索算法 的
查看原帖
有谁会写 禁忌搜索算法 的
52381
CodingJellyfish楼主2021/12/18 18:25

不知道怎么优化了,卡在了 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;
}


2021/12/18 18:25
加载中...