您的位置:首页 > 其它

【HDOJ】3220 Alice’s Cube

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

/* 3220 */
#include <iostream>
#include <queue>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;

char visit[1<<17];
const int end = 0x0ff;
int beg;
int dir[32][2] = {
1,2, 1,3, 1,5, 1,9,
2,4, 2,6, 2,10,
3,4, 3,7, 3,11,
4,8, 4,12,
5,6, 5,7, 5,13,
6,8, 6,14,
7,8, 7,15,
8,16,
9,10, 9,11, 9,13,
10,12, 10,14,
11,12, 11,15,
12,16,
13,14, 13,15,
14,16,
15,16
};

void bfs() {
int i, j, k, tmp;
queue<int> Q;
int a, b, s;
char t;

memset(visit, -1, sizeof(visit));
visit[end] = 0;
Q.push(end);

while (!Q.empty()) {
s = Q.front();
Q.pop();
t = visit[s];
if (t >= 3)
continue;
++t;
for (i=0; i<32; ++i) {
a = s & (1<<dir[i][0]);
b = s & (1<<dir[i][1]);
if (a ^ b) {
tmp = (s ^ (1<<dir[i][0])) ^ (1<<dir[i][1]);
if (visit[tmp] < 0) {
visit[tmp] = t;
Q.push(tmp);
}
}
}
}
}

void init() {
int i;

for (i=0; i<32; ++i) {
--dir[i][0];
--dir[i][1];
}

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=1; t<=tt; ++t) {
beg = 0;
for (i=15; i>=0; --i) {
scanf("%d", &j);
if (j)
beg |= (1<<i);
}
k = visit[beg];
if (k < 0)
printf("Case #%d: more\n", t);
else
printf("Case #%d: %d\n", t, k);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: