BOJ::1525 퍼즐

시사점

이해(x)

설계(x)

시간 복잡도

공간 복잡도

구현(x)

디버깅(x)

좋은 코드

#include <cstdio>
#include <cstring>
#include <utility>
using namespace std;

int x[3][3] = { 1, 2, 3, 4, 5, 6, 7, 8 };
unsigned char v[5381000];
int mul[9];

void bitmask(int &n)
{
    int i, j;
    n = 0;
    for (i = 0; i < 3; i++)
        for (j = 0; j < 3; j++)
            n += mul[x[i][j]] * (i * 3 + j);
}

void fetch(int a, int b)
{
    int n = a * 8 + b;
    int i;
    memset(x, 0, sizeof(x));
    for (i = 8; i >= 1; i--)
    {
        int k = n / mul[i];
        x[k / 3][k % 3] = i;
        n %= mul[i];
    }
}

const int MAX = 2300000;
int q[MAX];
int ft, bk;

int main()
{
    int i, j;
    int a, b, xa, xb, n;
    for (i = 1, j = 1; i <= 8; i++, j *= 9)
        mul[i] = j;
    bitmask(n);
    xa = n / 8;
    xb = n % 8;
    for (i = 0; i < 3; i++)
        for (j = 0; j < 3; j++)
            scanf("%d", &x[i][j]);
    if (getchar() != '\n') while (1);
    bitmask(n);
    a = n / 8;
    b = n % 8;
    v[a] |= (1 << b);

    q[bk++] = n;

    int dx[] = { 0, 0, 1, -1 };
    int dy[] = { 1, -1, 0, 0 };
    int t = 0;
    while (ft != bk)
    {
        for (int cnt = bk; ft != cnt;)
        {
            int cur = q[(ft++) % MAX];
            a = cur / 8;
            b = cur % 8;

            if (a == xa && b == xb)
            {
                printf("%d", t);
                return 0;
            }

            fetch(a, b);
            for (i = 0; i < 3; i++)
                for (j = 0; j < 3; j++)
                    if (x[i][j] == 0)
                        goto okay;
        okay:
            for (int k = 0; k < 4; k++)
            {
                int ny = i + dy[k];
                int nx = j + dx[k];
                if (nx >= 0 && nx < 3 && ny >= 0 && ny < 3)
                {
                    swap(x[ny][nx], x[i][j]);
                    bitmask(n);
                    a = n / 8;
                    b = n % 8;
                    if (!(v[a] & (1 << b)))
                    {
                        v[a] |= (1 << b);
                        q[(bk++) % MAX] = n;
                    }
                    swap(x[ny][nx], x[i][j]);
                }
            }
        }
        t++;
    }
    printf("-1");
}