• <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 1101 The Game

            問題:
            http://acm.pku.edu.cn/JudgeOnline/problem?id=1101

            思路:
            寬度優(yōu)先搜索
            要點: 每次擴展的時候,在各個方向(上下左右),不是簡單地只擴展一格,而是“直線延伸”式的擴展
            另外,由于允許路徑超出board范圍,所以在上下左右各多放置一欄空白
            由于使用C來寫,所以隊列就簡單地用數(shù)組模擬,一般情況下還是可行的,不過有時可能比較浪費空間,又有時可能會分配數(shù)組大小不夠而出現(xiàn)RE
            隊列的每個Element是一個State結構,其中包含了點坐標及到達該點的最小segments

            其實,雖然AC了,還是一直有個疑問,在找到目的點的時候,我們得到一個segments個數(shù),而且就直接將其作為問題的解,那會不會在另外一個方向存在另一條路徑到達這個目的點,而且其segments個數(shù)更小,只是該條路徑在隊列中尚未被訪問到?這也是當初我將vstd_drt數(shù)組設置成某點是否被訪問過及其被訪問的方向的初衷

              1 #define SIZE_MAX 77 /* 75+2 */
              2 #define UP 1
              3 #define DOWN 2
              4 #define LEFT 4
              5 #define RIGHT 8
              6 char board[SIZE_MAX][SIZE_MAX];
              7 int vstd_drt[SIZE_MAX][SIZE_MAX];
              8 int width, height;
              9 int start_x, start_y, end_x, end_y;
             10 struct State {
             11     int x;
             12     int y;
             13     int min;
             14 };
             15 struct State queue[SIZE_MAX*SIZE_MAX];
             16 int head, tail;
             17 const int dx[] = {-1100};
             18 const int dy[] = {00-11};
             19 
             20 int 
             21 is_valid(int x, int y)
             22 {
             23     return (x>=0 && x<=height+1 && y>=0 && y<=width+1);
             24 }
             25 
             26 #define ADD(i, j, min, drt) ++tail; \
             27     queue[tail].x = i; \
             28     queue[tail].y = j; \
             29     queue[tail].min = min; \
             30     vstd_drt[i][j] = drt;
             31 
             32 void
             33 push_queue(int x, int y, int drt, int min)
             34 {
             35     int i, j;
             36     switch(drt) {
             37         case UP:
             38             j = y;
             39             for(i=x; i>=0; i--) {
             40                 if(board[i][j]=='X')
             41                     break;
             42                 if(!vstd_drt[i][j]) {
             43                     ADD(i, j, min, drt);
             44                 }
             45             }
             46             break;
             47         case DOWN:
             48             j = y;
             49             for(i=x; i<=height+1; i++) {
             50                 if(board[i][j]=='X'
             51                     break;
             52                 if(!vstd_drt[i][j]) {
             53                     ADD(i, j, min, drt);
             54                 }
             55             }
             56             break;
             57         case LEFT:
             58             i = x;
             59             for(j=y; j>=0; j--) {
             60                 if(board[i][j]=='X')
             61                     break;
             62                 if(!vstd_drt[i][j]) {
             63                     ADD(i, j, min, drt);
             64                 }
             65             }
             66             break;
             67         case RIGHT:
             68             i = x;
             69             for(j=y; j<=width+1; j++) {
             70                 if(board[i][j]=='X')
             71                     break;
             72                 if(!vstd_drt[i][j]) {
             73                     ADD(i, j, min, drt);
             74                 }
             75             }
             76             break;
             77     }
             78 }
             79 
             80 int
             81 bfs()
             82 {
             83     int i, j, cur_x, cur_y, cur_min, nx, ny;
             84     for(i=0; i<4; i++) {
             85         nx = start_x + dx[i];
             86         ny = start_y + dy[i];
             87         if(is_valid(nx, ny) && board[nx][ny]==' ' && !vstd_drt[nx][ny])
             88             push_queue(nx, ny, 1<<i, 1);
             89     }
             90     while(head<tail) {
             91         ++head;
             92         cur_x = queue[head].x;
             93         cur_y = queue[head].y;
             94         cur_min = queue[head].min;
             95         if(cur_x==end_x && cur_y==end_y)
             96             return cur_min;
             97         for(i=0; i<4; i++) {
             98             nx = cur_x + dx[i];
             99             ny = cur_y + dy[i];
            100             if(is_valid(nx, ny) && board[nx][ny]==' ' && !vstd_drt[nx][ny])
            101                 push_queue(nx, ny, 1<<i, cur_min+1);
            102         }
            103     }
            104     return -1;
            105 }



            posted on 2010-07-05 09:10 simplyzhao 閱讀(200) 評論(0)  編輯 收藏 引用 所屬分類: B_搜索

            導航

            <2010年8月>
            25262728293031
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            統(tǒng)計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            狠狠久久综合伊人不卡| 日韩精品久久久肉伦网站| 久久久久亚洲AV成人网| 亚洲国产综合久久天堂| 久久国产精品久久久| 亚洲国产综合久久天堂| 婷婷综合久久狠狠色99h| 久久这里都是精品| 久久99精品国产| 亚洲国产另类久久久精品小说| 久久99免费视频| 久久久国产精品亚洲一区| 麻豆久久| 久久久久婷婷| 99久久精品国产综合一区| 久久丫精品国产亚洲av| 色妞色综合久久夜夜| 久久人人爽人人爽AV片| 久久精品国产91久久麻豆自制| 丁香色欲久久久久久综合网| 久久精品综合一区二区三区| 国产综合久久久久久鬼色| 久久婷婷色香五月综合激情| 久久久久无码专区亚洲av| 国产精品一区二区久久精品无码 | 99国产欧美久久久精品蜜芽| 麻豆久久| 一本一本久久a久久精品综合麻豆| 91精品国产综合久久香蕉 | 久久精品国产亚洲AV麻豆网站| 亚洲人成无码网站久久99热国产| 久久国产综合精品五月天| 久久久久免费视频| 色综合久久天天综线观看| 久久午夜综合久久| 亚洲精品无码久久不卡| 久久天天躁狠狠躁夜夜不卡| 伊人伊成久久人综合网777| 久久精品国产色蜜蜜麻豆| 亚洲国产精品久久久天堂| 99久久99久久久精品齐齐|