• <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| 久久久久国产精品熟女影院| 91精品国产91久久久久久青草| 久久99精品综合国产首页| 久久精品国产一区二区三区| 怡红院日本一道日本久久| 久久天天日天天操综合伊人av| 久久精品极品盛宴观看| 国产韩国精品一区二区三区久久| 久久国产成人午夜aⅴ影院| 亚洲精品NV久久久久久久久久| 久久久久高潮毛片免费全部播放| 国产精品成人99久久久久 | 久久青青草原精品影院| 2021国产精品久久精品| 久久电影网2021| 国产成年无码久久久免费| 国产精品欧美久久久久无广告| 久久人做人爽一区二区三区| 国产精品va久久久久久久| 久久精品无码一区二区无码 | 中文字幕久久波多野结衣av| 2021精品国产综合久久| 无码人妻久久一区二区三区| 99久久精品免费看国产一区二区三区| 亚洲精品蜜桃久久久久久| 久久无码人妻精品一区二区三区| 国产精品久久一区二区三区 | 久久综合亚洲色一区二区三区| 久久香蕉国产线看观看乱码| 人妻无码中文久久久久专区| 亚洲伊人久久综合影院| 久久久久久亚洲精品不卡| 狠狠色丁香婷婷综合久久来来去| 97久久精品午夜一区二区| 国产成人精品免费久久久久| 久久国产精品77777| 麻豆AV一区二区三区久久| 婷婷五月深深久久精品| 久久久久99精品成人片欧美| 亚洲人成伊人成综合网久久久|