1 条题解
-
0
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
- 上传者