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

            堅(jiān)信:勤能補(bǔ)拙

            PKU 2312 Battle City

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

            思路:
            這題糾結(jié)了...一上午都沒寫出來,原以為很簡(jiǎn)單的(其實(shí),很多人都說是簡(jiǎn)單題,艾)
            首先想到的是廣搜,因?yàn)槭乔髲脑袋c(diǎn)到目的地的最小步數(shù)嘛,典型的BFS,結(jié)果卻始終不知道如何表示每個(gè)狀態(tài)以及狀態(tài)間的判重
            既然廣搜不會(huì),那就深搜吧,恩,很快就寫出代碼,結(jié)果TLE...
            無奈,只好在網(wǎng)上找解法,發(fā)現(xiàn)一種相當(dāng)不錯(cuò)的BFS代碼:

            隊(duì)列的狀態(tài)只需要保存當(dāng)前位置即可,另外用數(shù)組best[][]表示目前從源點(diǎn)到達(dá)每個(gè)點(diǎn)的最小步數(shù)
            在從當(dāng)前點(diǎn)擴(kuò)展的時(shí)候,只將有最小步數(shù)更新的點(diǎn)加入隊(duì)列
            這樣當(dāng)BFS搜索結(jié)束時(shí),每個(gè)best[i][j]都保存了從源點(diǎn)到點(diǎn)[i][j]的最短步數(shù)
            原來還有這樣寫B(tài)FS的方法,又學(xué)習(xí)了(*^__^*) 嘻嘻……

            上述算法有點(diǎn)類似于求最短路徑呵呵
            而,事實(shí)上,這題是可以很容易轉(zhuǎn)化成圖論求單源最短路徑的

            代碼:
             1 /* 32MS */
             2 #include<stdio.h>
             3 #include<stdlib.h>
             4 #include<string.h>
             5 #define MAX_LEN 301
             6 #define QUEUE_SIZE 90001
             7 #define INF 0x7FFFFFFF
             8 #define is_valid(x, y) ((x)>=0 && (x)<M && (y)>=0 && (y)<N)
             9 char map[MAX_LEN][MAX_LEN];
            10 const int dx[] = {00-11};
            11 const int dy[] = {-1100};
            12 int M, N;
            13 int you_x, you_y, target_x, target_y;
            14 int best[MAX_LEN][MAX_LEN]; /* important, best[i][j] stores the current 'best solution' at map[i][j] */
            15 struct Node {
            16     int x, y;
            17 } queue[QUEUE_SIZE];
            18 
            19 int
            20 bfs()
            21 {
            22     int i, next_x, next_y, cur, head, tail;
            23     struct Node node;
            24     head = -1;
            25     tail = 0;
            26     queue[tail].x = you_x;
            27     queue[tail].y = you_y;
            28     best[you_x][you_y] = 0;
            29     while(head < tail) {
            30         ++head;
            31         cur = best[queue[head].x][queue[head].y];
            32         for(i=0; i<4; i++) {
            33             node.x = queue[head].x + dx[i];
            34             node.y = queue[head].y + dy[i];
            35             if(is_valid(node.x, node.y)) {
            36                 /* excellent, only push node which can be updated in 'best' into the queue */
            37                 if(map[node.x][node.y] == 'E' || map[node.x][node.y] == 'T') {
            38                     if(best[node.x][node.y] > cur+1) {
            39                         best[node.x][node.y] = cur+1;
            40                         ++tail;
            41                         queue[tail] = node;
            42                     }
            43                 } else if(map[node.x][node.y] == 'B') {
            44                     if(best[node.x][node.y] > cur+2) {
            45                         best[node.x][node.y] = cur+2;
            46                         ++tail;
            47                         queue[tail] = node;
            48                     }
            49                 }
            50             }
            51         }
            52     }
            53 }
            54 
            55 int
            56 main(int argc, char **argv)
            57 {
            58     int i, j;
            59     while(scanf("%d %d"&M, &N)!=EOF && M && N) {
            60         for(i=0; i<M; i++) {
            61             scanf("%s", map[i]);
            62             for(j=0; j<N; j++) {
            63                 if(map[i][j] == 'Y') {
            64                     you_x = i;
            65                     you_y = j;
            66                 } else if(map[i][j] == 'T') {
            67                     target_x = i; 
            68                     target_y = j;
            69                 }
            70                 best[i][j] = INF;
            71             }
            72         }
            73         bfs();
            74         printf("%d\n", best[target_x][target_y]==INF ? -1 : best[target_x][target_y]);
            75     }
            76 }


            posted on 2010-10-23 13:33 simplyzhao 閱讀(226) 評(píng)論(0)  編輯 收藏 引用 所屬分類: B_搜索

            導(dǎo)航

            <2010年6月>
            303112345
            6789101112
            13141516171819
            20212223242526
            27282930123
            45678910

            統(tǒng)計(jì)

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            77777亚洲午夜久久多喷| 久久久亚洲欧洲日产国码二区 | 久久亚洲AV成人无码国产| 91久久精品视频| 无码国内精品久久人妻蜜桃| 日韩欧美亚洲综合久久影院Ds| 国产一级持黄大片99久久| 99久久精品国产一区二区 | 91久久精品国产免费直播| 欧美成a人片免费看久久| 99久久精品免费看国产| 久久久久亚洲AV成人网人人网站 | 久久天天躁狠狠躁夜夜av浪潮 | 99蜜桃臀久久久欧美精品网站| 91精品国产高清91久久久久久| 久久亚洲国产精品五月天婷| 久久亚洲日韩精品一区二区三区| 精品久久人人妻人人做精品| 91久久福利国产成人精品| 丁香色欲久久久久久综合网| 久久国产精品无码网站| 久久天天日天天操综合伊人av| 精品亚洲综合久久中文字幕| 久久人人添人人爽添人人片牛牛| 久久久久久国产a免费观看不卡| 精品久久久久久无码中文字幕一区| 97久久综合精品久久久综合| 久久AV高潮AV无码AV| 久久久久久噜噜精品免费直播| 色成年激情久久综合| 久久国产精品免费| 久久久久久狠狠丁香| 久久精品国产亚洲av麻豆色欲| 久久亚洲国产精品成人AV秋霞| 7777久久亚洲中文字幕| 性欧美大战久久久久久久久| 久久狠狠爱亚洲综合影院| 久久香综合精品久久伊人| 伊人久久一区二区三区无码| 久久久久久免费一区二区三区| 国产三级久久久精品麻豆三级|