• <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 1606 Jugs/PKU 3414 Pots

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

            思路:
            典型的BFS
            好玩的就是如何來處理輸出,每個狀態包含一個指向前一個狀態的指針

            代碼:
              1 #define QUEUE_LEN 10000
              2 #define MAX_VOL 101
              3 const char ops[][12= {
              4     "FILL(1)",
              5     "FILL(2)",
              6     "DROP(1)",
              7     "DROP(2)",
              8     "POUR(1,2)",
              9     "POUR(2,1)" };
             10 int vola, volb, target;
             11 int head, tail;
             12 int visited[MAX_VOL][MAX_VOL];
             13 struct EACH {
             14     int a, b;
             15     int opnum;
             16     int opidx;
             17     struct EACH *pre;
             18 } queue[QUEUE_LEN];
             19 
             20 #define ADD(na, nb, num, idx) ++tail; \
             21     queue[tail].a = na; \
             22     queue[tail].b = nb; \
             23     queue[tail].opnum = num+1; \
             24     queue[tail].opidx = idx; \
             25     queue[tail].pre = queue+head; \
             26     visited[na][nb] = 1;
             27 
             28 void
             29 output(struct EACH *item)
             30 {
             31     if(item == NULL)
             32         return;
             33     output(item->pre);
             34     if(item->opidx >= 0)
             35         printf("%s\n", ops[item->opidx]);
             36 }
             37 
             38 void
             39 bfs()
             40 {
             41     int cur_a, cur_b, ta, tb, cur_opnum;
             42     queue[tail].a = 0;
             43     queue[tail].b = 0;
             44     queue[tail].opnum = 0;
             45     queue[tail].opidx = -1;
             46     queue[tail].pre = NULL;
             47     visited[0][0= 1;
             48     while(head < tail) {
             49         ++head;
             50         cur_a = queue[head].a;
             51         cur_b = queue[head].b;
             52         cur_opnum = queue[head].opnum;
             53         if(cur_a==target || cur_b==target) {
             54             printf("%d\n", cur_opnum);
             55             output(queue+head);
             56             return;
             57         }
             58         if(!visited[vola][cur_b]) { /* FILL(1) */
             59             ADD(vola, cur_b, cur_opnum, 0);
             60         }
             61         if(!visited[cur_a][volb]) { /* FILL(2) */
             62             ADD(cur_a, volb, cur_opnum, 1);
             63         }
             64         if(!visited[0][cur_b]) { /* DROP(1) */
             65             ADD(0, cur_b, cur_opnum, 2);
             66         }
             67         if(!visited[cur_a][0]) { /* DROP(2) */
             68             ADD(cur_a, 0, cur_opnum, 3);
             69         }
             70         /* POUR(1,2) */
             71         if(cur_a+cur_b > volb) {
             72             ta = cur_a+cur_b-volb;
             73             tb = volb;
             74             if(!visited[ta][tb]) {
             75                 ADD(ta, tb, cur_opnum, 4);
             76             }
             77         } else {
             78             ta = 0;
             79             tb = cur_a + cur_b;
             80             if(!visited[ta][tb]) {
             81                 ADD(ta, tb, cur_opnum, 4);
             82             }
             83         }
             84         /* POUR(2,1) */
             85         if(cur_a+cur_b > vola) {
             86             ta = vola;
             87             tb = cur_a+cur_b-vola;
             88             if(!visited[ta][tb]) {
             89                 ADD(ta, tb, cur_opnum, 5);
             90             }
             91         } else {
             92             ta = cur_a + cur_b;
             93             tb = 0;
             94             if(!visited[ta][tb]) {
             95                 ADD(ta, tb, cur_opnum, 5);
             96             }
             97         }
             98     }
             99     printf("impossible\n");
            100 }

            posted on 2010-07-30 13:45 simplyzhao 閱讀(287) 評論(0)  編輯 收藏 引用 所屬分類: B_搜索

            導航

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

            統計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久国语露脸国产精品电影| 久久国产热这里只有精品| 武侠古典久久婷婷狼人伊人| 色8激情欧美成人久久综合电| 99精品国产免费久久久久久下载| 亚洲中文字幕无码久久综合网 | 国产精品美女久久久久网| 97精品国产97久久久久久免费 | 久久免费的精品国产V∧| 999久久久免费国产精品播放| 久久精品一区二区三区中文字幕 | 久久av高潮av无码av喷吹| 久久精品人妻中文系列| 青青青国产成人久久111网站| 久久久久亚洲精品天堂久久久久久| 一本一本久久a久久综合精品蜜桃| 久久国产一区二区| 欧美一区二区三区久久综| 久久久精品无码专区不卡| 久久精品毛片免费观看| 久久伊人精品一区二区三区| 国产精品热久久无码av| 777米奇久久最新地址| 亚洲午夜久久久久久久久电影网 | 亚洲精品综合久久| 久久成人永久免费播放| 国产精品狼人久久久久影院 | 国产精品美女久久久m| 国产美女亚洲精品久久久综合 | 精品无码久久久久国产| 久久人人爽人人人人爽AV| 亚洲精品久久久www| 午夜视频久久久久一区| 亚洲国产成人精品无码久久久久久综合| 九九精品99久久久香蕉| 日产精品99久久久久久| 国产精品久久久久久久app| 国内精品久久久久影院亚洲 | 久久精品一区二区三区不卡| 99久久精品国产高清一区二区| 一本一本久久A久久综合精品|