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

            堅信:勤能補拙

            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方法來解題,該方法的一個缺點在于每個點可能多次進入隊列,這也直接導(dǎo)致了單個點的多次擴展

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

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

            代碼(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 閱讀(194) 評論(0)  編輯 收藏 引用 所屬分類: B_搜索

            導(dǎo)航

            <2010年7月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統(tǒng)計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久丫精品国产亚洲av不卡| 理论片午午伦夜理片久久| 狠狠色狠狠色综合久久| 久久99精品国产自在现线小黄鸭| 久久中文字幕一区二区| 色综合久久中文字幕综合网| 青青草原综合久久大伊人| 久久午夜电影网| 亚洲AV乱码久久精品蜜桃| 国产精品亚洲综合专区片高清久久久| 久久婷婷色香五月综合激情| 久久夜色tv网站| 久久婷婷成人综合色综合| 性做久久久久久久久久久| 秋霞久久国产精品电影院| 亚洲熟妇无码另类久久久| 国产综合成人久久大片91| 欧美久久综合性欧美| 久久精品亚洲一区二区三区浴池| 性欧美大战久久久久久久| 久久久久99精品成人片牛牛影视| 国产Av激情久久无码天堂| 亚洲女久久久噜噜噜熟女| 久久人人爽人人爽人人片AV东京热 | 国内精品久久久久久不卡影院| 久久久久久伊人高潮影院| 久久综合色区| 欧美午夜A∨大片久久 | 国内精品伊人久久久久AV影院| 热99RE久久精品这里都是精品免费| 国产精品99久久久久久猫咪| 91精品国产91久久综合| 人妻无码中文久久久久专区| 亚洲国产另类久久久精品小说| 欧美激情一区二区久久久| 狠狠色丁香久久婷婷综合图片| 日本久久中文字幕| 久久综合九色综合欧美就去吻| 久久国产午夜精品一区二区三区| 国产精久久一区二区三区| 久久男人中文字幕资源站|