• <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 閱讀(424) 評論(0)  編輯 收藏 引用

            導航

            <2009年6月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            統計

            常用鏈接

            留言簿(1)

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲国产成人久久精品99 | 热久久国产精品| 久久亚洲国产精品一区二区| 久久精品国产一区| 久久无码国产| 久久精品国产亚洲AV无码偷窥 | 77777亚洲午夜久久多喷| 国产精品九九久久免费视频| 波多野结衣久久精品| 国产精品久久久久久一区二区三区| 久久久久久久综合综合狠狠| 久久精品国产男包| 久久国产精品二国产精品| 久久人人爽爽爽人久久久| 精品久久综合1区2区3区激情| 精品人妻伦九区久久AAA片69| 激情久久久久久久久久| 久久久久久毛片免费播放| 久久乐国产综合亚洲精品| 婷婷综合久久狠狠色99h| 久久国产精品无码HDAV| 性做久久久久久久久浪潮| 久久国产精品-久久精品| 无码人妻久久一区二区三区免费丨| 国产日韩欧美久久| 91精品国产综合久久四虎久久无码一级 | 久久久久久国产精品无码超碰| 亚洲欧美另类日本久久国产真实乱对白 | 精品久久久噜噜噜久久久 | 国产巨作麻豆欧美亚洲综合久久| 久久人人爽人人爽人人AV东京热| 99久久香蕉国产线看观香| 欧美一区二区久久精品| 亚洲?V乱码久久精品蜜桃 | 伊人久久大香线蕉综合影院首页 | www性久久久com| 99久久精品国产麻豆| 久久99热国产这有精品| 99久久er这里只有精品18| 97热久久免费频精品99| 99国产欧美久久久精品蜜芽|