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

            導航

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

            統計

            常用鏈接

            留言簿(1)

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久精品国产亚洲av影院| 日本欧美久久久久免费播放网 | 亚洲国产精品无码久久| 无码国内精品久久综合88| 中文字幕无码免费久久| 久久精品国产亚洲AV无码麻豆 | 久久久九九有精品国产| 久久免费小视频| 久久亚洲国产成人影院| 久久久一本精品99久久精品66| 久久99国产精品99久久| 色综合久久久久综合99| 久久精品黄AA片一区二区三区| 久久精品国产黑森林| avtt天堂网久久精品| 奇米影视7777久久精品人人爽| 99久久国语露脸精品国产| 欧美与黑人午夜性猛交久久久| 国产精品女同久久久久电影院| 久久人人爽人人爽AV片| 国产成人精品久久免费动漫| 要久久爱在线免费观看| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 久久亚洲AV无码西西人体| 日日躁夜夜躁狠狠久久AV| 久久伊人影视| 久久免费国产精品| 91久久九九无码成人网站| 99久久无码一区人妻a黑| 久久精品国产乱子伦| 一级A毛片免费观看久久精品| 日韩亚洲欧美久久久www综合网| 亚洲AV无码成人网站久久精品大| 亚洲国产成人精品91久久久| 国产成人久久精品二区三区| 国产亚洲欧美成人久久片| 99久久99这里只有免费费精品| 久久久亚洲裙底偷窥综合| 一级女性全黄久久生活片免费| 国产成人精品久久一区二区三区av | 精品久久久久久99人妻|