• <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>

            A Za, A Za, Fighting...

            堅信:勤能補(bǔ)拙

            PKU 2312 Battle City (Cont.)

            問題:
            http://poj.org/problem?id=2312

            思路:
            http://www.shnenglu.com/Joe/archive/2010/10/23/130973.html中,參考網(wǎng)上代碼采用了一種"新"的BFS方法來解題,該方法的一個缺點在于每個點可能多次進(jìn)入隊列,這也直接導(dǎo)致了單個點的多次擴(kuò)展

            其實,這題可以采用原始的BFS方法來做,只是不能再用普通的隊列,而需要使用優(yōu)先級隊列
            通過這題,使我對于寬度優(yōu)先搜索有了新的認(rèn)識
            普通的BFS之所以能夠找到最小的步數(shù),關(guān)鍵在于它是單步擴(kuò)展的,也就是說它首先羅列出所有在一步之內(nèi)可以到達(dá)的點,然后再羅列所有在兩步之內(nèi)可以到達(dá)的點,類似于"1-1-1...-2-2-2...-3-3-3..."的方式
            這題在擴(kuò)展的時候并非都是一步,所以普通的BFS并不能找出正確的解,例如:
            Y B
            E T
            假如我們以右、下、左、上的順序進(jìn)行擴(kuò)展,那么我們將得出結(jié)果是3,而事實上只需要2

            優(yōu)先級隊列之所以能夠找出正確解,是因為它保證我們始終從最小步數(shù)的點開始擴(kuò)展

            代碼(C++)
             1 /* 0MS */
             2 #include<iostream>
             3 #include<cstdio>
             4 #include<cstring>
             5 #include<queue> /* priority queue */
             6 using namespace std;
             7 
             8 #define MAX_LEN 301
             9 #define is_valid(x, y) ((x)>=0 && (x)<M && (y)>=0 && (y)<N)
            10 char map[MAX_LEN][MAX_LEN];
            11 const int dx[] = {00-11};
            12 const int dy[] = {-1100};
            13 int M, N;
            14 int you_x, you_y, target_x, target_y;
            15 int visited[MAX_LEN][MAX_LEN];
            16 struct Node {
            17     int x, y;
            18     int steps;
            19     bool operator<(const Node &item) const {
            20         return steps > item.steps;
            21     }
            22 }cur, next;
            23 priority_queue<Node> states;
            24 
            25 int
            26 bfs()
            27 {
            28     int i;
            29     memset(visited, 0sizeof(visited));
            30     while(!states.empty()) /* empty the queue */
            31         states.pop();
            32     next.x = you_x;
            33     next.y = you_y;
            34     next.steps = 0;
            35     visited[you_x][you_y] = 1;
            36     states.push(next);
            37     while(!states.empty()) {
            38         cur = states.top();
            39         states.pop();
            40         if(cur.x==target_x && cur.y==target_y)
            41             return cur.steps;
            42         for(i=0; i<4; i++) {
            43             next.x = cur.x + dx[i];
            44             next.y = cur.y + dy[i];
            45             if(!visited[next.x][next.y]) {
            46                 visited[next.x][next.y] = 1;
            47                 if(map[next.x][next.y]=='E' || map[next.x][next.y]=='T') {
            48                     next.steps = cur.steps+1;
            49                     states.push(next);
            50                 } else if(map[next.x][next.y]=='B') {
            51                     next.steps = cur.steps+2;
            52                     states.push(next);
            53                 }
            54             }
            55         }
            56     }
            57     return -1;
            58 }
            59 
            60 int
            61 main(int argc, char **argv)
            62 {
            63     int i, j;
            64     while(scanf("%d %d"&M, &N)!=EOF && M && N) {
            65         for(i=0; i<M; i++) {
            66             scanf("%s", map[i]);
            67             for(j=0; j<N; j++) {
            68                 if(map[i][j] == 'Y') {
            69                     you_x = i;
            70                     you_y = j;
            71                 } else if(map[i][j] == 'T') {
            72                     target_x = i; 
            73                     target_y = j;
            74                 }
            75             }
            76         }
            77         printf("%d\n", bfs());
            78     }
            79 }

            posted on 2010-10-23 20:10 simplyzhao 閱讀(190) 評論(0)  編輯 收藏 引用 所屬分類: B_搜索

            導(dǎo)航

            <2010年10月>
            262728293012
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            統(tǒng)計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲狠狠婷婷综合久久蜜芽| 囯产精品久久久久久久久蜜桃| 亚洲成色WWW久久网站| 狠狠色伊人久久精品综合网| 九九久久99综合一区二区| 国产亚洲精品自在久久| 久久99国产亚洲高清观看首页| 亚洲精品乱码久久久久久蜜桃不卡| 中文字幕无码久久人妻| 亚洲精品蜜桃久久久久久| 国内精品久久久久影院老司| 久久狠狠爱亚洲综合影院| 国产精品99久久精品| 色诱久久av| 久久国产精品99国产精| 久久精品无码一区二区三区免费 | 无码人妻少妇久久中文字幕蜜桃| 久久综合鬼色88久久精品综合自在自线噜噜 | AV无码久久久久不卡蜜桃| 久久婷婷五月综合国产尤物app | 久久亚洲精品成人AV| 久久亚洲国产中v天仙www| 久久久久久极精品久久久| 亚洲AV伊人久久青青草原| 亚洲国产精品无码久久久蜜芽| 久久精品a亚洲国产v高清不卡| 久久香蕉国产线看观看99| 久久精品国产99国产精品| 777午夜精品久久av蜜臀| 久久综合久久综合久久综合| 亚洲精品午夜国产va久久| 国产精品99精品久久免费| 久久国产香蕉视频| 久久精品国产亚洲av麻豆色欲| 精品国产青草久久久久福利 | 久久久久亚洲AV成人网| 久久无码人妻一区二区三区| 色综合合久久天天综合绕视看 | 久久精品国产亚洲AV香蕉| 国产激情久久久久影院老熟女免费 | 国产精品丝袜久久久久久不卡|