zoukankan      html  css  js  c++  java
  • 【HDOJ】1429 胜利大逃亡(续)

    BFS+状态压缩,做了很多状态压缩了。今晚把八数码问题给搞定了。

     1 #include <iostream>
     2 #include <queue>
     3 #include <cstring>
     4 #include <cstdio>
     5 using namespace std;
     6 
     7 typedef struct node_st {
     8     int x, y, t;
     9     int key;
    10     node_st() {}
    11     node_st(int xx, int yy, int tt, int kk) {
    12         x = xx; y = yy; t = tt; key = kk;
    13     }
    14 } node_st;
    15 
    16 char map[25][25];
    17 char visit[1<<10][25][25];
    18 int direct[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
    19 int n, m, time;
    20 
    21 int bfs(int bx, int by) {
    22     int x, y, key, t;
    23     int i, tmp;
    24     queue<node_st> que;
    25     node_st node;
    26 
    27     memset(visit, 0, sizeof(visit));
    28     visit[bx][by][0] = 1;
    29     que.push(node_st(bx,by,0,0));
    30 
    31     while ( !que.empty() ) {
    32         node = que.front();
    33         if (node.t >= time)
    34             return -1;
    35         if (map[node.x][node.y] == '^')
    36             return node.t;
    37         que.pop();
    38         t = node.t + 1;
    39         for (i=0; i<4; ++i) {
    40             x = node.x + direct[i][0];
    41             y = node.y + direct[i][1];
    42             if (x<0 || x>=n || y<0 || y>=m)
    43                 continue;
    44             if (map[x][y]>='a' && map[x][y]<='j')
    45                 key = node.key | (1<<(map[x][y]-'a'));
    46             else
    47                 key = node.key;
    48             if (visit[key][x][y] || map[x][y]=='*')
    49                 continue;
    50             if (map[x][y]>='A' && map[x][y]<='J') {
    51                 tmp = (1<<(map[x][y]-'A')) & key;
    52                 if ( !tmp )
    53                     continue;
    54             }
    55             que.push(node_st(x,y,t,key));
    56             visit[key][x][y] = 1;
    57         }
    58     }
    59 
    60     return -1;
    61 }
    62 
    63 int main() {
    64     int bx, by;
    65     int i, j;
    66 
    67     while (scanf("%d %d %d", &n, &m, &time) != EOF) {
    68         for (i=0; i<n; ++i) {
    69             scanf("%s", map[i]);
    70             for (j=0; j<m; ++j) {
    71                 if (map[i][j] == '@') {
    72                     bx = i;
    73                     by = j;
    74                 }
    75             }
    76         }
    77         i = bfs(bx, by);
    78         printf("%d
    ", i);
    79     }
    80 
    81     return 0;
    82 }
  • 相关阅读:
    HDU 3091 Necklace <<状压dp
    HDU 1074 Doing Homework<<状压dp
    单片机程序设计中的“分层思想”
    单片机的 FIFO循环队列实现
    串口多字节接收
    单片机多字节串口接收(转)
    SD卡应用总结(Fatfs)
    FATFS 初学之 磁盘 I/O接口
    FATFS 初学之 f_gets/ f_putc/ f_puts/ f_printf
    FATFS 初学之 f_chdir/ f_chdrive
  • 原文地址:https://www.cnblogs.com/bombe1013/p/3762817.html
Copyright © 2011-2022 走看看