【HDOJ】3220 Alice’s Cube

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

 1 /* 3220 */
 2 #include <iostream>
 3 #include <queue>
 4 #include <algorithm>
 5 #include <cstdio>
 6 #include <cstring>
 7 using namespace std;
 8
 9
10 char visit[1<<17];
11 const int end = 0x0ff;
12 int beg;
13 int dir[32][2] = {
14     1,2, 1,3, 1,5, 1,9,
15     2,4, 2,6, 2,10,
16     3,4, 3,7, 3,11,
17     4,8, 4,12,
18     5,6, 5,7, 5,13,
19     6,8, 6,14,
20     7,8, 7,15,
21     8,16,
22     9,10, 9,11, 9,13,
23     10,12, 10,14,
24     11,12, 11,15,
25     12,16,
26     13,14, 13,15,
27     14,16,
28     15,16
29 };
30
31 void bfs() {
32     int i, j, k, tmp;
33     queue<int> Q;
34     int a, b, s;
35     char t;
36
37     memset(visit, -1, sizeof(visit));
38     visit[end] = 0;
39     Q.push(end);
40
41     while (!Q.empty()) {
42         s = Q.front();
43         Q.pop();
44         t = visit[s];
45         if (t >= 3)
46             continue;
47         ++t;
48         for (i=0; i<32; ++i) {
49             a = s & (1<<dir[i][0]);
50             b = s & (1<<dir[i][1]);
51             if (a ^ b) {
52                 tmp = (s ^ (1<<dir[i][0])) ^ (1<<dir[i][1]);
53                 if (visit[tmp] < 0) {
54                     visit[tmp] = t;
55                     Q.push(tmp);
56                 }
57             }
58         }
59     }
60 }
61
62 void init() {
63     int i;
64
65     for (i=0; i<32; ++i) {
66         --dir[i][0];
67         --dir[i][1];
68     }
69
70     bfs();
71 }
72
73 int main() {
74     int t, tt;
75     int i, j, k;
76
77     #ifndef ONLINE_JUDGE
78         freopen("data.in", "r", stdin);
79         freopen("data.out", "w", stdout);
80     #endif
81
82     init();
83     scanf("%d", &tt);
84     for (t=1; t<=tt; ++t) {
85         beg = 0;
86         for (i=15; i>=0; --i) {
87             scanf("%d", &j);
88             if (j)
89                 beg |= (1<<i);
90         }
91         k = visit[beg];
92         if (k < 0)
93             printf("Case #%d: more\n", t);
94         else
95             printf("Case #%d: %d\n", t, k);
96     }
97
98     return 0;
99 }
时间: 2024-10-14 05:15:55

【HDOJ】3220 Alice’s Cube的相关文章

【HDOJ】3660 Alice and Bob&#39;s Trip

就是一个基本的dfs.可关键问题是c/c++/g++光输入就超时了.还是写java过的,毕竟时限4s.都放弃希望了,没想到还真过了. 1 import java.lang.*; 2 import java.io.*; 3 import java.util.*; 4 5 6 public class Main { 7 8 public static void main(String[] args) throws java.lang.Exception { 9 InputStream inputSt

【HDOJ】4122 Alice&#39;s mooncake shop

RMQ的基础题目,简单题. 1 /* 4122 */ 2 #include <iostream> 3 #include <sstream> 4 #include <string> 5 #include <map> 6 #include <queue> 7 #include <set> 8 #include <stack> 9 #include <vector> 10 #include <deque>

【HDOJ】3309 Roll The Cube

BFS,考虑一球进洞仅一球滚动以及两球重叠的情况即可. 1 /* 3309 */ 2 #include <iostream> 3 #include <queue> 4 #include <cstdio> 5 #include <cstring> 6 #include <cstdlib> 7 using namespace std; 8 9 #define MAXN 25 10 11 typedef struct { 12 int x[2], y[

【HDOJ】4956 Poor Hanamichi

基本数学题一道,看错位数,当成大数减做了,而且还把方向看反了.所求为最接近l的值. 1 #include <cstdio> 2 3 int f(__int64 x) { 4 int i, sum; 5 6 i = sum = 0; 7 while (x) { 8 if (i & 1) 9 sum -= x%10; 10 else 11 sum += x%10; 12 ++i; 13 x/=10; 14 } 15 return sum; 16 } 17 18 int main() { 1

【HDOJ】1099 Lottery

题意超难懂,实则一道概率论的题目.求P(n).P(n) = n*(1+1/2+1/3+1/4+...+1/n).结果如果可以除尽则表示为整数,否则表示为假分数. 1 #include <cstdio> 2 #include <cstring> 3 4 #define MAXN 25 5 6 __int64 buf[MAXN]; 7 8 __int64 gcd(__int64 a, __int64 b) { 9 if (b == 0) return a; 10 else return

【HDOJ】2844 Coins

完全背包. 1 #include <stdio.h> 2 #include <string.h> 3 4 int a[105], c[105]; 5 int n, m; 6 int dp[100005]; 7 8 int mymax(int a, int b) { 9 return a>b ? a:b; 10 } 11 12 void CompletePack(int c) { 13 int i; 14 15 for (i=c; i<=m; ++i) 16 dp[i]

【HDOJ】3509 Buge&#39;s Fibonacci Number Problem

快速矩阵幂,系数矩阵由多个二项分布组成.第1列是(0,(a+b)^k)第2列是(0,(a+b)^(k-1),0)第3列是(0,(a+b)^(k-2),0,0)以此类推. 1 /* 3509 */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #incl

【HDOJ】1818 It&#39;s not a Bug, It&#39;s a Feature!

状态压缩+优先级bfs. 1 /* 1818 */ 2 #include <iostream> 3 #include <queue> 4 #include <cstdio> 5 #include <cstring> 6 #include <cstdlib> 7 #include <algorithm> 8 using namespace std; 9 10 #define MAXM 105 11 12 typedef struct {

【HDOJ】2424 Gary&#39;s Calculator

大数乘法加法,直接java A了. 1 import java.util.Scanner; 2 import java.math.BigInteger; 3 4 public class Main { 5 public static void main(String[] args) { 6 Scanner cin = new Scanner(System.in); 7 int n; 8 int i, j, k, tmp; 9 int top; 10 boolean flag; 11 int t