• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            糯米

            TI DaVinci, gstreamer, ffmpeg
            隨筆 - 167, 文章 - 0, 評論 - 47, 引用 - 0
            數(shù)據(jù)加載中……

            POJ 1475 Pushing Boxes 推箱子游戲 寬搜

            思路:
            這題就是平常玩的那種推箱子的游戲。不過簡化了一下,只是推一個箱子而已。
            用 bfs 來做,搜索樹里面的節(jié)點,也就是狀態(tài),可以定義為:
            1. 箱子的坐標
            2. 上一次推完之后,人要走多少步才能到達箱子的上、下、左、右側。如果到達不了,值則為無窮大。

            這樣,狀態(tài)轉移的時候。
            就首先看是否能向某個方向推。如果能的話,就推一下。
            然后對人進行一次 bfs ,看下此時到達箱子的各個側要走多少步。
            就可以生成一個新的狀態(tài)了。

            判重的處理做得很簡單:
            對于同一個坐標,不可能存在一個狀態(tài),它的“人要走多少步才能到達箱子的上、下、左、右側”這四個值都比另外一個狀態(tài)大。

            代碼寫得很亂,調(diào)試得真痛苦,足足4K多啊,看了下 status 里面,發(fā)現(xiàn)有的牛人代碼還是寫得很短的,佩服佩服!
            后來又看了標程,發(fā)現(xiàn)太飄逸了,看不懂。。



            #include <stdio.h>
            #include 
            <stdlib.h>
            #include 
            <string.h>

            #define DATA_SIZE 24
            #define QUEUE_SIZE 65536
            #define INFINITE 1000000

            #define dbp printf

            struct node {
                
            int y, x, dir, dis[4], pushes, walks;
                
            struct node *next, *hash_next;
            }
            ;

            struct queue {
                
            struct node arr[QUEUE_SIZE];
                
            int qh, qt;
            }
            ;

            struct node box, man, off[4= {
                
            {-10}{10}{0-1}{01}    
            }
            ;
            int H, W;
            char map[DATA_SIZE][DATA_SIZE];
            char lower[] = "nswe", upper[] = "NSWE";

            __inline 
            int input()
            {
                
            int i, j;

                scanf(
            "%d%d"&H, &W);
                
            if (!H)
                    
            return 0;

                
            for (i = 0; i < H; i++{
                    scanf(
            "%s", map[i]);
                    
            for (j = 0; j < W; j++{
                        
            if (map[i][j] == 'B'{
                            box.x 
            = j;
                            box.y 
            = i;
                            map[i][j] 
            = '.';
                        }
             else if (map[i][j] == 'S'{
                            man.x 
            = j;
                            man.y 
            = i;
                            map[i][j] 
            = '.';
                        }

                    }

                }


                
            return 1;
            }


            __inline 
            int can_go(int y, int x)
            {
                
            return x >= 0 && x < W && y >= 0 && y < H && map[y][x] != '#';
            }


            __inline 
            void move_man(struct node *b, struct node *m, struct node *rec[])
            {
                
            int mask, got, i;
                
            static struct queue q;
                
            static char visited[DATA_SIZE][DATA_SIZE];

                mask 
            = 0;
                
            for (i = 0; i < 4; i++)
                    
            if (can_go(b->+ off[i].y, b->+ off[i].x)) 
                        mask 
            |= 1 << i;

            #define PUSH(_y, _x, _walks, _next, _dir)    \
                
            if (_y == b->&& _x == b->x) {    \
                    got 
            |= 1 << _dir;    \
                    b
            ->dis[_dir] = _walks;    \
                    
            if (rec)    \
                        rec[_dir] 
            = m;    \
                }
             else if (!visited[_y][_x]) {    \
                    q.arr[q.qt].y 
            = _y;    \
                    q.arr[q.qt].x 
            = _x;    \
                    q.arr[q.qt].walks 
            = _walks;    \
                    q.arr[q.qt].next 
            = _next;    \
                    q.arr[q.qt].dir 
            = _dir;    \
                    visited[_y][_x] 
            = 1;    \
                    q.qt
            ++;    \
                }


                q.qh 
            = q.qt = 0;
                
            for (i = 0; i < 4; i++)
                    b
            ->dis[i] = INFINITE;
                memset(visited, 
            0sizeof(visited));
                PUSH(m
            ->y, m->x, 0, NULL, 0);
                got 
            = 0;

                
            while (q.qh != q.qt && got != mask) {
                    m 
            = &q.arr[q.qh++];
                    
            for (i = 0; i < 4; i++{
                        
            if (!can_go(m->+ off[i].y, m->+ off[i].x))
                            
            continue;
                        PUSH(m
            ->+ off[i].y, m->+ off[i].x, 
                             m
            ->walks + 1, m, i
                             );
                    }

                }


            #undef PUSH

            }


            __inline 
            struct node *reverse(struct node *t)
            {
                
            struct node *p, *n;

                p 
            = NULL;
                
            while (t) {
                    n 
            = t->next;
                    t
            ->next = p;
                    p 
            = t;
                    t 
            = n;
                }


                
            return p;
            }


            __inline 
            int hash_insert(struct node **p, struct node *b)
            {
                
            int i;
                
            struct node *h;

                
            for (h = *p; h; h = h->hash_next) {
                    
            for (i = 0; i < 4; i++)
                        
            if (h->dis[i] > b->dis[i])
                            
            break;
                    
            if (i == 4)
                        
            return 0;
                }

                b
            ->hash_next = *p;
                
            *= b;
                
            return 1;
            }


            __inline 
            void dump_walks(struct node *b, struct node *m, int d)
            {
                
            struct node *rec[4];

                move_man(b, m, rec);
                
            //dbp("(%d,%d) -> (%d,%d) %c\n", m->x, m->y, b->x, b->y, lower[d]);
                for (b = reverse(rec[d])->next; b; b = b->next)
                    putchar(lower[b
            ->dir]);
                putchar(upper[d]);
            }


            __inline 
            void solve()
            {
                
            struct node *b, *n, *best;
                
            static struct queue q;
                
            static struct node *hash[DATA_SIZE][DATA_SIZE];
                
            int i;

                memset(hash, 
            0sizeof(hash));

            #define PUSH(_y, _x, _m, _pushes, _walks, _next, _dir)    \
            {    \
                n 
            = &q.arr[q.qt];    \
                n
            ->= _y;    \
                n
            ->= _x;    \
                n
            ->pushes = _pushes;    \
                n
            ->walks = _walks;    \
                n
            ->next = _next;    \
                n
            ->dir = _dir;    \
                move_man(n, _m, NULL);    \
                
            if (map[_y][_x] == 'T'{    \
                    
            if (!best || n->walks < best->walks) {    \
                        best 
            = n;    \
                        q.qt
            ++;    \
                    }
                \
                }
             else if (hash_insert(&hash[_y][_x], n)) {    \
                    q.qt
            ++;    \
                }
                \
            }


                best 
            = NULL;
                q.qh 
            = q.qt = 0;
                PUSH(box.y, box.x, 
            &man, 00, NULL, 0);

                
            while (q.qt != q.qh) {
                    b 
            = &q.arr[q.qh++];
                    
            if (best && b->pushes > best->pushes)
                        
            break;
                    
            for (i = 0; i < 4; i++{
                        
            if (!can_go(b->+ off[i].y, b->+ off[i].x))
                            
            continue;
                        
            if (b->dis[i] == INFINITE)
                            
            continue;
                        PUSH(b
            ->+ off[i].y, b->+ off[i].x, 
                             b, b
            ->pushes + 1, b->dis[i] + b->walks,
                             b, i
                             );
                    }

                }


                
            if (!best) {
                    printf(
            "Impossible.\n\n");
                    
            return ;
                }


                
            //dbp("%d pushes %d walks\n", best->pushes, best->walks);
                b = reverse(best);
                dump_walks(b, 
            &man, b->next->dir);
                n 
            = b;
                
            for (b = b->next; b->next; b = b->next) {
                    dump_walks(b, n, b
            ->next->dir);
                    n 
            = b;
                }

                printf(
            "\n\n");
            }


            int main()
            {
                
            int i;
                
                freopen(
            "e:\\test\\in.txt""r", stdin);

                
            for (i = 1; input(); i++{
                    printf(
            "Maze #%d\n", i);
                    solve();
                }


                
            return 0;
            }

            posted on 2010-03-30 09:07 糯米 閱讀(780) 評論(0)  編輯 收藏 引用 所屬分類: POJ

            精品综合久久久久久97超人| 99久久人妻无码精品系列| 99久久国产宗和精品1上映| 99热成人精品免费久久| 久久96国产精品久久久| 久久国产欧美日韩精品| 麻豆亚洲AV永久无码精品久久| 久久久久久久波多野结衣高潮| 久久久国产视频| 2019久久久高清456| 亚洲精品无码成人片久久| 无码精品久久久天天影视| 亚洲国产精品无码久久一线| 伊人久久大香线蕉综合影院首页| 亚洲AV日韩AV天堂久久| 久久AV高清无码| 久久99精品国产麻豆婷婷| 色悠久久久久久久综合网| 中文字幕久久久久人妻| 国产午夜免费高清久久影院| av无码久久久久久不卡网站| 精品亚洲综合久久中文字幕| 久久综合视频网站| 久久综合狠狠综合久久综合88 | 97久久久精品综合88久久| 国产一区二区三区久久精品| 久久久精品久久久久久| 国产精品99久久久精品无码| 国产成人久久精品一区二区三区| 久久国产精品免费一区二区三区| 久久99国产精品久久99小说| 国产午夜久久影院| 国内精品伊人久久久久妇| 久久99精品国产99久久| 性做久久久久久免费观看| 久久超乳爆乳中文字幕| 久久久无码精品午夜| 97精品国产91久久久久久| 女人高潮久久久叫人喷水| 国产精品久久久久…| 久久无码高潮喷水|