• <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
            好玩的就是如何來處理輸出,每個狀態(tài)包含一個指向前一個狀態(tài)的指針

            代碼:
              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_搜索

            導(dǎo)航

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

            統(tǒng)計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久99国产乱子伦精品免费| 国产精品一区二区久久精品| 婷婷久久综合九色综合绿巨人| 精品久久久久久国产免费了| 久久久久久久久久久久久久| 国产精品久久久久aaaa| 久久国产V一级毛多内射| 99久久精品国产一区二区| 久久久久久久99精品免费观看| 色婷婷久久久SWAG精品| 久久99精品国产自在现线小黄鸭 | 色噜噜狠狠先锋影音久久| 一本久久精品一区二区| 国产成人精品久久一区二区三区| 久久亚洲国产精品123区| 国产精品久久久久天天影视| 久久精品国产男包| 久久久久女教师免费一区| 久久精品国产网红主播| 久久久久久久久66精品片| 狠狠人妻久久久久久综合蜜桃 | 久久午夜电影网| 少妇人妻88久久中文字幕| 久久国产精品一区| 国内精品伊人久久久久网站| 久久精品国产亚洲77777| 香蕉久久av一区二区三区| 久久久这里只有精品加勒比| 精品99久久aaa一级毛片| 久久久久国产精品| 青青国产成人久久91网| 久久久久夜夜夜精品国产| 99久久久精品| 婷婷综合久久狠狠色99h| 国产精品九九九久久九九| 国产精品国色综合久久| 99久久这里只有精品| 亚洲乱亚洲乱淫久久| 51久久夜色精品国产| 久久国产福利免费| 热久久最新网站获取|