1 条题解

  • 0
    @ 2026-9-30 12:42:51

    C++ :

    
    #include <cstdio>
    #include <cstring>
    /* 九连环:9 环,用 bit0..bit8 表示第1..9环(1=在杆上)。
       可动条件:第1环随时可动;第2环需第1环为1;
                 第 i 环(i>2) 需 1..i-2 全为0,且第 i-1 环为1。
       512 个状态构成一条链(度分布:2 个端点度为1,其余 510 个度为2),
       因此 111111111 -> 000000000 的最短路唯一,共 341 步。
       题面串序:左→右 = 第1环…第9环,故输出时 bit0 在前。 */
    static int nbr(int st, int *out){
        int c = 0;
        for(int i = 0; i < 9; i++){
            int ok;
            if(i == 0) ok = 1;
            else if(i == 1) ok = (st >> 0) & 1;
            else {
                int low = st & ((1 << (i - 1)) - 1);
                ok = (low == 0) && ((st >> (i - 1)) & 1);
            }
            if(ok) out[c++] = st ^ (1 << i);
        }
        return c;
    }
    int main(){
        int x;
        if(scanf("%d", &x) != 1) return 0;
        if(x < 0){ printf("-1\n"); return 0; }
        int start = (1 << 9) - 1, goal = 0;
        static int q[512], pre[512];
        memset(pre, -1, sizeof(pre));
        int head = 0, tail = 0;
        q[tail++] = start; pre[start] = start;
        while(head < tail){
            int u = q[head++];
            if(u == goal) break;
            int nx[16];
            int c = nbr(u, nx);
            for(int k = 0; k < c; k++){
                int v = nx[k];
                if(pre[v] < 0){ pre[v] = u; q[tail++] = v; }
            }
        }
        if(pre[goal] < 0){ printf("-1\n"); return 0; }
        /* 回溯:fwd[0]=目标态,fwd[k]=倒数第 k 步…… */
        static int fwd[512];
        int m = 0, cur = goal;
        while(cur != start){ fwd[m++] = cur; cur = pre[cur]; }
        if(x > m){ printf("-1\n"); return 0; }        /* 超过 341 步 */
        int st = (x == 0) ? start : fwd[m - x];
        for(int i = 0; i < 9; i++) putchar('0' + ((st >> i) & 1));
        putchar('\n');
        return 0;
    }
    
    
    • 1

    信息

    ID
    2661
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者