【HDOJ】3220 Alice’s Cube

时间:2022-07-10 11:19:56

状态压缩+逆向BFS。
方向数组就是任意相邻的两点(初始化时减1),每个顶点均有4个相邻点。因此,共有16*4/2=32个方向。按序排列即可找到。

 /* 3220 */
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std; char visit[<<];
const int end = 0x0ff;
int beg;
int dir[][] = {
,, ,, ,, ,,
,, ,, ,,
,, ,, ,,
,, ,,
,, ,, ,,
,, ,,
,, ,,
,,
,, ,, ,,
,, ,,
,, ,,
,,
,, ,,
,,
,
}; void bfs() {
int i, j, k, tmp;
queue<int> Q;
int a, b, s;
char t; memset(visit, -, sizeof(visit));
visit[end] = ;
Q.push(end); while (!Q.empty()) {
s = Q.front();
Q.pop();
t = visit[s];
if (t >= )
continue;
++t;
for (i=; i<; ++i) {
a = s & (<<dir[i][]);
b = s & (<<dir[i][]);
if (a ^ b) {
tmp = (s ^ (<<dir[i][])) ^ (<<dir[i][]);
if (visit[tmp] < ) {
visit[tmp] = t;
Q.push(tmp);
}
}
}
}
} void init() {
int i; for (i=; i<; ++i) {
--dir[i][];
--dir[i][];
} bfs();
} int main() {
int t, tt;
int i, j, k; #ifndef ONLINE_JUDGE
freopen("data.in", "r", stdin);
freopen("data.out", "w", stdout);
#endif init();
scanf("%d", &tt);
for (t=; t<=tt; ++t) {
beg = ;
for (i=; i>=; --i) {
scanf("%d", &j);
if (j)
beg |= (<<i);
}
k = visit[beg];
if (k < )
printf("Case #%d: more\n", t);
else
printf("Case #%d: %d\n", t, k);
} return ;
}