【HDOJ】3220 Alice’s Cube
2015-03-02 16:01
441 查看
状态压缩+逆向BFS。
方向数组就是任意相邻的两点(初始化时减1),每个顶点均有4个相邻点。因此,共有16*4/2=32个方向。按序排列即可找到。
方向数组就是任意相邻的两点(初始化时减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; }
相关文章推荐
- HDU 3220 Alice’s Cube:题目解答源码
- HDU 3220 Alice’s Cube:题目解答源码
- HDU 3220 Alice’s Cube:题目解答源码
- HDU 3220 Alice’s Cube
- HDU 3220 Alice’s Cube
- ACM--公式--HDOJ 1220--Cube
- hdoj 5053 the Sum of Cube [数学 立方求和]
- HDOJ 1220 Cube (数学)
- HDU 3220 Alice’s Cube (09年上海区域赛水题(位压缩、逆向搜索、打表))
- hdoj 1220 Cube(数学题)
- 博弈 HDOJ 4371 Alice and Bob
- hdoj the Sum of Cube 5053 (简单数学)
- hdoj 3660 Alice and Bob's Trip(树dp)
- SPOJ 5151 Alice’s Cube
- HDOJ 4268 Alice and Bob (set的应用)
- HDU 3220 Alice’s Cube(逆向搜索)
- HDOJ 1220-Cube【数学推理】
- hdoj 1220 Cube
- 【HDOJ 3584】 Cube(树状数组<区间更新,单点查询>)
- HDOJ-5053(the Sum of Cube)