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

            POJ 3414

            http://acm.pku.edu.cn/JudgeOnline/problem?id=3414
            又是一道廣搜題,可這次卻有個不一樣的地方,除了求出最短步數外,還要輸出最短路徑出來。在原來結點的基礎上,增加pre和flag兩個變量,分別記錄父結點在隊列中的位置和進行哪種操作。記錄最短路徑讓我費了一些周折。看來這里還是不很熟悉,以后得多加練習和思考c
              1 #include<stdio.h>
              2 #include<string.h>
              3 #include<stdlib.h>
              4 int a,b,c;
              5 typedef struct node{
              6     int liter1,liter2,step,pre,flag;
              7 }Node;
              8 typedef struct queue{
              9     Node q[11000];
             10     int front,rear;
             11 }Queue;
             12 Queue Q;
             13 int path[11000],j;
             14 int visit[101][101];
             15 void bfs();
             16 int main()
             17 {
             18     while(scanf("%d%d%d",&a,&b,&c) != EOF)
             19         bfs();
             20     system("pause");
             21     return 0;
             22 }
             23 
             24 void bfs()
             25 {
             26     Node pot;
             27     Node lx,lc;
             28     memset(visit,0,sizeof(visit));
             29     pot.liter1 = 0;
             30     pot.liter2 = 0;
             31     pot.step = 0;
             32     pot.pre = -1;
             33     Q.front = Q.rear = 1;
             34     Q.q[Q.rear++= pot;
             35     visit[0][0= 1;
             36     while(Q.front != Q.rear){
             37         lc = Q.q[Q.front++];
             38         if(lc.liter1 == c || lc.liter2 == c)break;
             39         for(int i = 1;i < 7;i++){
             40             if(i == 1){
             41                 lx.liter1 = a;
             42                 lx.liter2 = lc.liter2;
             43                 lx.step = lc.step + 1;
             44                 lx.pre = Q.front-1;
             45                 lx.flag = i;
             46                 if(visit[lx.liter1][lx.liter2] == 0){
             47                     visit[lx.liter1][lx.liter2] = 1;
             48                     Q.q[Q.rear++= lx;
             49                 }
             50             }
             51             if(i == 2){
             52                 lx.liter1 = lc.liter1;
             53                 lx.liter2 = b;
             54                 lx.step = lc.step + 1;
             55                 lx.pre = Q.front-1;
             56                 lx.flag = i;
             57                 if(visit[lx.liter1][lx.liter2] == 0){
             58                     visit[lx.liter1][lx.liter2] = 1;
             59                     Q.q[Q.rear++= lx;
             60                 }
             61             }
             62             if(i == 3){
             63                 lx.liter1 = 0;
             64                 lx.liter2 = lc.liter2;
             65                 lx.step = lc.step + 1;
             66                 lx.pre = Q.front-1;
             67                 lx.flag = i;
             68                 if(visit[lx.liter1][lx.liter2] == 0){
             69                     visit[lx.liter1][lx.liter2] = 1;
             70                     Q.q[Q.rear++= lx;
             71                 }
             72             }
             73             if(i == 4){
             74                 lx.liter1 = lc.liter1;
             75                 lx.liter2 = 0;
             76                 lx.step = lc.step + 1;
             77                 lx.pre = Q.front-1;
             78                 lx.flag = i;
             79                 if(visit[lx.liter1][lx.liter2] == 0){
             80                     visit[lx.liter1][lx.liter2] = 1;
             81                     Q.q[Q.rear++= lx;
             82                 }
             83             }
             84             if(i == 5){//2 to 1
             85                 if(lc.liter1 + lc.liter2 > a){
             86                     lx.liter1 = a;
             87                     lx.liter2 = lc.liter1 + lc.liter2 - a;
             88                 }
             89                 else{
             90                     lx.liter1 = lc.liter1 + lc.liter2;
             91                     lx.liter2 = 0;
             92                 }
             93                 lx.step = lc.step + 1;
             94                 lx.pre = Q.front-1;
             95                 lx.flag = i;
             96                 
             97                 if(visit[lx.liter1][lx.liter2] == 0){
             98                     visit[lx.liter1][lx.liter2] = 1;
             99                     Q.q[Q.rear++= lx;
            100                 }
            101             }
            102             if(i == 6){//1 to 2
            103                 if(lc.liter1 + lc.liter2 > b){
            104                     lx.liter1 = lc.liter1 + lc.liter2 - b;
            105                     lx.liter2 = b;
            106                 }
            107                 else{
            108                     lx.liter1 = 0;
            109                     lx.liter2 = lc.liter1 + lc.liter2;
            110                 }
            111                 lx.step = lc.step + 1;
            112                 lx.pre = Q.front-1;
            113                 lx.flag = i;
            114                 
            115                 if(visit[lx.liter1][lx.liter2] == 0){
            116                     visit[lx.liter1][lx.liter2] = 1;
            117                     Q.q[Q.rear++= lx;
            118                 }
            119             }
            120         }
            121     }
            122     if(Q.front == Q.rear){
            123         printf("impossible\n");
            124         return;
            125     }
            126     j = 0;
            127     for(int i = Q.front-1;i>=0;){
            128         path[j++= i;
            129         i = Q.q[i].pre;
            130     }
            131     printf("%d\n",Q.q[Q.front-1].step);
            132     for(int i = j-1;i>= 0;i--){
            133         switch(Q.q[path[i]].flag){
            134             case 1:printf("FILL(1)\n");break;
            135             case 2:printf("FILL(2)\n");break;
            136             case 3:printf("DROP(1)\n");break;
            137             case 4:printf("DROP(2)\n");break;
            138             case 5:printf("POUR(2,1)\n");break;
            139             case 6:printf("POUR(1,2)\n");break;
            140         }
            141     }
            142         
            143 }
            code

            posted on 2009-06-09 11:27 Johnnx 閱讀(429) 評論(0)  編輯 收藏 引用

            導航

            <2013年8月>
            28293031123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            統計

            常用鏈接

            留言簿(1)

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            91精品无码久久久久久五月天 | 久久综合亚洲鲁鲁五月天| 一本大道久久a久久精品综合| 久久91综合国产91久久精品| 国产成人精品久久| 久久亚洲精品国产精品婷婷| 久久成人国产精品| 久久久久香蕉视频| 99久久久精品免费观看国产| 久久精品18| 国产精品18久久久久久vr| 开心久久婷婷综合中文字幕| 99久久er这里只有精品18| 久久综合久久鬼色| 成人a毛片久久免费播放| 久久人妻少妇嫩草AV蜜桃| 久久精品国产国产精品四凭| 国内精品久久久久伊人av | 婷婷综合久久中文字幕蜜桃三电影| 国内精品久久久久影院一蜜桃| 日日狠狠久久偷偷色综合96蜜桃| 欧美丰满熟妇BBB久久久| 性做久久久久久久久老女人| 久久久久中文字幕| 韩国免费A级毛片久久| 久久99热这里只有精品国产| 国内精品久久久久久久涩爱| 久久精品国产影库免费看| 99精品国产99久久久久久97| 综合久久一区二区三区 | 久久精品国产AV一区二区三区 | 国产麻豆精品久久一二三| 亚洲人成电影网站久久| 精品人妻伦九区久久AAA片69 | 久久精品一区二区影院| 97久久香蕉国产线看观看| 久久综合给久久狠狠97色| 国产成人精品综合久久久久| 伊人久久久AV老熟妇色| 中文字幕人妻色偷偷久久| 亚洲国产另类久久久精品小说|