青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

A Za, A Za, Fighting...

堅信:勤能補拙

PKU 1475 Pushing Boxes

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

思路:
很復雜的一題,從discuss知道可以采用嵌套的BFS來做,不過始終不知道如何下手
通過這題,發現自己對于復雜問題的coding能力比較弱,不能很好的理清其中的邏輯關系,需要多多鍛煉

這題的關鍵是抓住box的每一次擴展,都對應地存在一個person的起始位置,兩者需要同時記錄

參考:
http://www.chhaya.me/?p=147

代碼:
  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4 #define MAX_LEN 21
  5 /* north, south, east, west */
  6 const int dx[] = {-1100};
  7 const int dy[] = {001-1};
  8 const char dir_box[] = "NSEW";
  9 const char dir_psn[] = "nsew";
 10 int r, c;
 11 int px, py, bx, by, btx, bty;
 12 char map[MAX_LEN][MAX_LEN];
 13 struct EACH {
 14     int x, y;
 15     int id;
 16     int pre;
 17     int dir;
 18 };
 19 struct EACH cur_each, tmp_each, cur_psn, tmp_psn, box_queue[MAX_LEN*MAX_LEN], psn_queue[MAX_LEN*MAX_LEN];
 20 struct {
 21     int x, y;
 22 }persons[MAX_LEN*MAX_LEN];
 23 int visited_box[MAX_LEN][MAX_LEN];
 24 int visited_psn[MAX_LEN][MAX_LEN];
 25 int cnt[MAX_LEN*MAX_LEN];
 26 char seq[MAX_LEN*MAX_LEN][MAX_LEN*MAX_LEN];
 27 
 28 int
 29 is_valid_box(struct EACH item, int dir)
 30 {
 31     int tmpx, tmpy;
 32     if(item.x<0 || item.x>=|| item.y<0 || item.y>=|| map[item.x][item.y]=='#')
 33         return 0;
 34     /* see if there exists a position for person to push */
 35     tmpx = item.x-2*dx[dir];
 36     tmpy = item.y-2*dy[dir];
 37     if(tmpx<0 || tmpx>=|| tmpy<0 || tmpy>=|| map[tmpx][tmpy]=='#')
 38         return 0;
 39     return 1;
 40 }
 41 
 42 int
 43 is_valid_psn(int psnx, int psny, int boxx, int boxy)
 44 {
 45     if(psnx<0 || psnx>=|| psny<0 || psny>=|| map[psnx][psny]=='#')
 46         return 0;
 47     /* path of person can't cover the box */
 48     if(psnx==boxx && psny==boxy)
 49         return 0;
 50     return 1;
 51 }
 52 
 53 int
 54 psn_bfs(int startx, int starty, int endx, int endy, int dir, int index)
 55 {
 56     int i, head, tail;
 57     struct EACH tmp;
 58     memset(visited_psn, 0sizeof(visited_psn));
 59     head = -1;
 60     tail = 0;
 61     psn_queue[tail].x = startx;
 62     psn_queue[tail].y = starty;
 63     psn_queue[tail].pre = -1;
 64     visited_psn[startx][starty] = 1;
 65     while(head < tail) {
 66         ++head;
 67         cur_psn = psn_queue[head];
 68         if(cur_psn.x==endx && cur_psn.y==endy) {
 69             /* record */
 70             /* here 'index' should plus 1, according to box_bfs */
 71             persons[index+1].x = cur_psn.x + dx[dir];
 72             persons[index+1].y = cur_psn.y + dy[dir];
 73             cnt[index+1= 0;
 74             tmp = cur_psn;
 75             while(tmp.pre != -1) {
 76                 seq[index+1][cnt[index+1]++= dir_psn[tmp.dir];
 77                 tmp = psn_queue[tmp.pre];
 78             }
 79             return 1;
 80         }
 81         for(i=0; i<4; i++) {
 82             tmp_psn.x = cur_psn.x + dx[i];
 83             tmp_psn.y = cur_psn.y + dy[i];
 84             if(is_valid_psn(tmp_psn.x, tmp_psn.y, endx+dx[dir], endy+dy[dir]) && !visited_psn[tmp_psn.x][tmp_psn.y]) {
 85                 ++tail;
 86                 tmp_psn.pre = head;
 87                 tmp_psn.dir = i;
 88                 psn_queue[tail] = tmp_psn;
 89                 visited_psn[tmp_psn.x][tmp_psn.y] = 1;
 90             }
 91         }
 92     }
 93     return 0;
 94 }
 95 
 96 void
 97 output(struct EACH *end)
 98 {
 99     int i, index;
100     if(end->pre == -1)
101         return;
102     output(box_queue+(end->pre));
103     index = end->id;
104     for(i=cnt[index]-1; i>=0; i--)
105         printf("%c", seq[index][i]);
106     printf("%c", dir_box[end->dir]);
107 }
108 
109 void
110 box_bfs()
111 {
112     int i, psn_rt, head, tail;
113     head = -1;
114     tail = 0;
115     memset(visited_box, 0sizeof(visited_box));
116     box_queue[tail].x = bx;
117     box_queue[tail].y = by;
118     box_queue[tail].pre = -1;
119     box_queue[tail].id = tail;
120     visited_box[bx][by] = 1;
121     persons[tail].x = px;
122     persons[tail].y = py;
123     while(head < tail) {
124         ++head;
125         cur_each = box_queue[head];
126         if(cur_each.x==btx && cur_each.y==bty) {
127             /* output */
128             output(box_queue+head);
129             return;
130         }
131         for(i=0; i<4; i++) {
132             tmp_each.x = cur_each.x + dx[i];
133             tmp_each.y = cur_each.y + dy[i];
134             if(is_valid_box(tmp_each, i) && !visited_box[tmp_each.x][tmp_each.y]) {
135                 /* bfs for person */
136                 psn_rt = psn_bfs(persons[head].x, persons[head].y, tmp_each.x-2*dx[i], tmp_each.y-2*dy[i], i, tail);
137                 if(psn_rt) {
138                     ++tail;
139                     tmp_each.dir = i;
140                     tmp_each.pre = head;
141                     tmp_each.id = tail;
142                     box_queue[tail] = tmp_each;
143                     visited_box[tmp_each.x][tmp_each.y] = 1;
144                 }
145             }
146         }
147     }
148     printf("Impossible.");
149 }
150 
151 int
152 main(int argc, char **argv)
153 {
154     int i, j, tests = 0;
155     while(scanf("%d %d"&r, &c) != EOF) {
156         if(r==0 && c==0)
157             break;
158         for(i=0; i<r; i++) {
159             scanf("%s", map[i]);
160             for(j=0; j<c; j++) {
161                 if(map[i][j] == 'S') {
162                     px = i;
163                     py = j;
164                 } else if(map[i][j] == 'B') {
165                     bx = i;
166                     by = j;
167                 } else if(map[i][j] == 'T') {
168                     btx = i;
169                     bty = j;
170                 }
171             }
172         }
173         printf("Maze #%d\n"++tests);
174         /* bfs */
175         box_bfs();
176         printf("\n\n");
177     }
178 }

posted on 2010-08-05 12:14 simplyzhao 閱讀(283) 評論(0)  編輯 收藏 引用 所屬分類: B_搜索

導航

<2011年5月>
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234

統計

常用鏈接

留言簿(1)

隨筆分類

隨筆檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲婷婷免费| 国产精品高潮呻吟久久| 亚洲日本va在线观看| 欧美亚洲网站| 亚洲性感激情| 亚洲伊人观看| 亚洲欧美日韩精品一区二区| 久久精品一级爱片| 午夜免费在线观看精品视频| 亚洲一区二区视频在线| 国产精品99久久久久久白浆小说| 国产精品久久77777| 欧美日韩在线播放一区二区| 欧美日韩中文另类| 国产精品久久久久久亚洲毛片 | 中文在线一区| 亚洲免费一区二区| 久久成人精品电影| 久久综合久久综合久久| 欧美黄色影院| 中国成人亚色综合网站| 久久综合福利| 免费日韩av片| 亚洲调教视频在线观看| 久久久久看片| 欧美三区在线| 亚洲国产黄色片| 亚洲欧美在线视频观看| 欧美大片91| 午夜精品亚洲| 欧美日韩亚洲天堂| 黄色成人在线网址| 一二三区精品| 久久综合久久88| 99热在线精品观看| 美女免费视频一区| 99精品国产在热久久| 亚洲高清一区二| 亚洲精品国产精品国自产在线| 中日韩男男gay无套| 久久噜噜亚洲综合| 亚洲精品激情| 久久精品国产亚洲一区二区| 欧美日韩亚洲一区三区| 影音欧美亚洲| 午夜视频在线观看一区| 亚洲国产日韩美| 午夜久久久久久久久久一区二区| 欧美精品一区三区| 亚洲国产精品久久人人爱蜜臀 | 久久一区二区三区四区五区| 欧美日韩精品一区二区在线播放 | 欧美一级免费视频| 欧美日韩在线三区| 91久久午夜| 久久免费视频网站| 制服丝袜激情欧洲亚洲| 欧美交受高潮1| 亚洲黄色在线| 免费影视亚洲| 久久五月天婷婷| 一区二区在线视频播放| 久久精品国产亚洲一区二区三区| 亚洲一区免费| 国产免费一区二区三区香蕉精| 亚洲夜间福利| 在线亚洲国产精品网站| 欧美视频日韩| 中文欧美字幕免费| 日韩午夜电影av| 欧美日韩三区四区| 亚洲一区国产| 亚洲永久视频| 国产一区二区高清视频| 久久夜色精品亚洲噜噜国产mv| 亚洲欧美日韩综合| 国产日韩欧美亚洲| 久久久高清一区二区三区| 久久国产66| 亚洲国产综合视频在线观看| 亚洲激情自拍| 国产精品久久97| 久久久999国产| 老司机精品久久| 9久草视频在线视频精品| 99综合视频| 在线视频欧美一区| 午夜精品影院在线观看| 国产视频一区二区在线观看| 久久精品国产欧美亚洲人人爽| 欧美在线亚洲在线| 精品999日本| 亚洲大片av| 欧美日韩日本视频| 久久高清福利视频| 毛片基地黄久久久久久天堂| 日韩视频第一页| 一本色道久久88精品综合| 国产精品国产三级国产专区53 | 亚洲成色777777在线观看影院| 欧美日韩免费在线| 欧美一级久久久久久久大片| 久久精品欧美| 亚洲一区高清| **欧美日韩vr在线| 国产精品99久久不卡二区| 在线看不卡av| 亚洲综合色噜噜狠狠| 91久久在线播放| 午夜激情综合网| 日韩视频精品在线| 久久久久久9| 午夜精品婷婷| 欧美激情精品久久久久久蜜臀 | 国产精品福利网| 亚洲电影免费观看高清完整版在线观看 | 久久久成人网| 欧美日韩一区在线播放| 欧美成人激情在线| 国产精品欧美日韩一区| 欧美成人午夜激情在线| 国产欧美日韩| 日韩一级视频免费观看在线| 永久555www成人免费| 亚洲自拍偷拍色片视频| 日韩视频一区二区三区在线播放免费观看| 亚洲欧美日韩天堂一区二区| 夜夜躁日日躁狠狠久久88av| 久久国产精品亚洲77777| 亚洲欧美综合网| 欧美日韩亚洲一区二区三区在线 | 亚洲精品美女久久久久| 在线观看国产精品淫| 欧美一级成年大片在线观看| 亚洲综合色网站| 欧美日韩一区在线观看视频| 亚洲精品乱码| 欧美二区乱c少妇| 欧美日韩国产va另类| 亚洲第一主播视频| 一区二区亚洲欧洲国产日韩| 久久精品国产久精国产思思| 久久精品午夜| 国产日韩欧美制服另类| 欧美中文在线观看国产| 久久久午夜精品| 一区二区在线视频观看| 蜜桃精品久久久久久久免费影院| 欧美高清在线观看| 在线日韩欧美视频| 麻豆成人在线播放| 欧美高清视频一区二区| 亚洲国产99精品国自产| 免费看精品久久片| 亚洲区一区二区三区| 一区二区高清视频在线观看| 欧美日韩国产综合视频在线观看中文| 亚洲国产精品999| 亚洲精品一区中文| 欧美日韩免费精品| 亚洲视频1区| 欧美一区二区视频网站| 国产一区二区黄| 久久精品亚洲一区二区| 欧美国产日韩精品免费观看| 亚洲靠逼com| 欧美精品一区二区三| 一本色道久久| 久久琪琪电影院| 亚洲人体一区| 欧美日韩亚洲另类| 欧美在线观看一区二区| 欧美激情国产日韩精品一区18| 一区二区三区免费看| 国产三级欧美三级| 欧美 日韩 国产一区二区在线视频| 亚洲免费福利视频| 久久精品99无色码中文字幕| 亚洲看片一区| 国产一区二区三区久久 | 欧美激情偷拍| 亚洲欧美日韩中文视频| 精品1区2区| 欧美日本亚洲韩国国产| 亚洲欧美日韩中文在线制服| 欧美激情一区二区久久久| 亚洲制服av| 亚洲国产91精品在线观看| 欧美日韩在线精品一区二区三区| 欧美一区二区三区四区在线| 最新中文字幕一区二区三区| 欧美成年人网站| 亚洲欧美日韩专区| 亚洲精品国产精品久久清纯直播| 久久精品一区中文字幕| 亚洲精选在线观看| 精品成人国产在线观看男人呻吟| 国产精品久久一卡二卡| 欧美激情视频一区二区三区不卡| 久久精品国产一区二区三区免费看 |