• 【HDOJ】2405 Marbles in Three Baskets


    BFS+状态压缩。

      1 /* 2405 */
      2 #include <iostream>
      3 #include <queue>
      4 #include <cstdio>
      5 #include <cstring>
      6 #include <cstdlib>
      7 using namespace std;
      8 
      9 #define MAXN 216000
     10 #define MAXM 2005
     11 
     12 typedef struct {
     13     int a, b, c;
     14 } node_t;
     15 
     16 node_t Q[MAXM];
     17 int pre[MAXM];
     18 int sum;
     19 int front, rear;
     20 bool visit[MAXN];
     21 
     22 int bfs() {
     23     int i, j, k;
     24     node_t nd, tmp;
     25     
     26     sum = Q[0].a + Q[0].b + Q[0].c;
     27     if (sum % 3)
     28         return 0;
     29     if (Q[0].a == Q[0].b && Q[0].b == Q[0].c)
     30         return 0;
     31     
     32     front = 0;
     33     rear = 1;
     34     memset(visit, false, sizeof(visit));
     35     k = Q[0].a*3600 + Q[0].b*60 + Q[0].c;
     36     visit[k] = true;
     37     
     38     while (front < rear) {
     39         // move from b to a
     40         nd = Q[front];
     41         if (nd.b > nd.a) {
     42             nd.b -= nd.a;
     43             nd.a += nd.a;
     44             k = nd.a*3600 + nd.b*60 + nd.c;
     45             if (visit[k] == false) {
     46                 visit[k] = true;
     47                 Q[rear] = nd;
     48                 pre[rear] = front;
     49                 ++rear;
     50             }
     51             if (nd.a==nd.b && nd.b==nd.c)
     52                 return rear-1;
     53         }
     54         // move from c to a
     55         nd = Q[front];
     56         if (nd.c > nd.a) {
     57             nd.c -= nd.a;
     58             nd.a += nd.a;
     59             k = nd.a*3600 + nd.b*60 + nd.c;
     60             if (visit[k] == false) {
     61                 visit[k] = true;
     62                 Q[rear] = nd;
     63                 pre[rear] = front;
     64                 ++rear;
     65             }
     66             if (nd.a==nd.b && nd.b==nd.c)
     67                 return rear-1;
     68         }
     69         // move from a to b
     70         nd = Q[front];
     71         if (nd.a > nd.b) {
     72             nd.a -= nd.b;
     73             nd.b += nd.b;
     74             k = nd.a*3600 + nd.b*60 + nd.c;
     75             if (visit[k] == false) {
     76                 visit[k] = true;
     77                 Q[rear] = nd;
     78                 pre[rear] = front;
     79                 ++rear;
     80             }
     81             if (nd.a==nd.b && nd.b==nd.c)
     82                 return rear-1;
     83         }
     84         // move from c to b
     85         nd = Q[front];
     86         if (nd.c > nd.b) {
     87             nd.c -= nd.b;
     88             nd.b += nd.b;
     89             k = nd.a*3600 + nd.b*60 + nd.c;
     90             if (visit[k] == false) {
     91                 visit[k] = true;
     92                 Q[rear] = nd;
     93                 pre[rear] = front;
     94                 ++rear;
     95             }
     96             if (nd.a==nd.b && nd.b==nd.c)
     97                 return rear-1;
     98         }
     99         // move from a to c
    100         nd = Q[front];
    101         if (nd.a > nd.c) {
    102             nd.a -= nd.c;
    103             nd.c += nd.c;
    104             k = nd.a*3600 + nd.b*60 + nd.c;
    105             if (visit[k] == false) {
    106                 visit[k] = true;
    107                 Q[rear] = nd;
    108                 pre[rear] = front;
    109                 ++rear;
    110             }
    111             if (nd.a==nd.b && nd.b==nd.c)
    112                 return rear-1;
    113         }
    114         // move from b to c
    115         nd = Q[front];
    116         if (nd.b > nd.c) {
    117             nd.b -= nd.c;
    118             nd.c += nd.c;
    119             k = nd.a*3600 + nd.b*60 + nd.c;
    120             if (visit[k] == false) {
    121                 visit[k] = true;
    122                 Q[rear] = nd;
    123                 pre[rear] = front;
    124                 ++rear;
    125             }
    126             if (nd.a==nd.b && nd.b==nd.c)
    127                 return rear-1;
    128         }
    129         ++front;
    130     }
    131     
    132     return 0;
    133 }
    134 
    135 void printPath(int x) {
    136     if (pre[x] != -1)
    137         printPath(pre[x]);
    138     printf("%4d %3d %3d
    ", Q[x].a, Q[x].b, Q[x].c);
    139 }
    140 
    141 int main() {
    142     int i, j, k;
    143     
    144     #ifndef ONLINE_JUDGE
    145         freopen("data.in", "r", stdin);
    146         freopen("data.out", "w", stdout);
    147     #endif
    148     
    149     pre[0] = -1;
    150     while (scanf("%d %d %d", &Q[0].a, &Q[0].b, &Q[0].c) != EOF) {
    151         k = bfs();
    152         printPath(k);
    153         puts("============");
    154     }
    155     
    156     return 0;
    157 }
  • 相关阅读:
    C++多线程同步技巧(三)--- 互斥体
    Windows核心编程笔记之进程
    HTTP协议之分块传输与分段编码
    CVE-2013-2551:Internet Explore VML COALineDashStyleArray 整数溢出漏洞简单调试分析
    SQLServer数据库及注入方法
    Windows核心编程笔记之内核对象
    Windows核心编程笔记之错误处理
    Windows核心编程笔记之处理字符串
    CVE-2012-0774:Adobe Reader TrueType 字体整数溢出漏洞调试分析
    CVE-2012-1876:Internet Exporter MSHTML.DLL CaculateMinMax 堆溢出简单分析
  • 原文地址:https://www.cnblogs.com/bombe1013/p/4298530.html
Copyright © 2020-2023  润新知