zoukankan      html  css  js  c++  java
  • windows下Dev解10l7l3l倒水

    题面:一个容积10L的水桶装满水,还有二个7L、3L的水桶无水,水不能倒到别的地方,要让10L的水桶里有5L水最少倒几次

    需求:给大一学弟学妹讲解广度优先搜索

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    int b[3][100005];
    int stime=0; //数字越大.休眠时间越久
    int m=0,i,j;
    int time1=107,time2=103,time3=710,time4=73,time5=37,time6=310;
    int head=1,tail=2,btime=0,bord;
    void zzzz(){
      _sleep(stime*1000); //休眠时间单位ms
      printf(" %d %d %d ",b[0][i],b[1][i],b[2][i]);
      printf("%d %d %d %d ",btime, b[0][tail-1],b[1][tail-1],b[2][tail-1]);
      if(b[1][tail-1]==5 || b[0][tail-1]==5){ m=1;}
    }
    int main()
    {
      b[0][0]=10; b[1][0]=7; b[2][0]=3;
      b[0][1]=10; b[1][1]=0; b[2][1]=0;
      //三杯子,初始只有10L的杯子是满的
      // b[0][1]=1; b[1][1]=0; b[2][1]=0;
      //三杯子,初始10L的杯子是满的
      while(head<tail){
        if(m==1) break;
        btime++;
        bord=tail;
        for(i=head;i<bord;i++){
          printf(" %d %d %d %d ",btime, b[0][i],b[1][i],b[2][i]);
          if(m==1) break;
          //找到55平分则退出
          if(b[0][i]!=0){
          //如果10L的杯子有酒
            if(b[1][i]<7){
            //如果7L的杯子没满
              if(b[0][i]+b[1][i]<7){
                //如果10L和7L杯子加起来不能补满7L的杯子
                b[0][tail]=0;
                b[1][tail]=b[1][i]+b[0][i];
                //全倒入7L杯子
                b[2][tail]=b[2][i];
                zzzz();
              }else{
                //如果10L和7L杯子加起来补满7L的杯子
                b[0][tail]=b[1][i]+b[0][i]-7;
                b[1][tail]=7;
                //7L杯子补满
                b[2][tail]=b[2][i];
                tail++;
                zzzz();
               }
            }
            if(b[2][i]<3){
            //如果3L的杯子没满  
              if(b[0][i]+b[2][i]<3){
              //如果10L和3L杯子加起来不能补满3L的杯子
                b[0][tail]=0;
                b[1][tail]=b[1][i];
                b[2][tail]=b[2][i]+b[0][i];
                //全倒入3L杯子
                tail++;
                zzzz();
              }else{

              //如果10L和3L杯子加起来补满3L的杯子
                b[0][tail]=b[2][i]+b[0][i]-3;
                b[1][tail]=b[1][i];
                b[2][tail]=3;
                //3L杯子补满
                tail++;
                zzzz();
              }
            }
          } //10-7 10-3
          if(b[1][i]!=0){
          //如果7L的杯子有酒
            if(b[0][i]<10){
            //如果10L的杯子没满
              if(b[0][i]+b[1][i]<b[0][0]){
              //如果10L和7L杯子加起来不能补满10L的杯子
                b[0][tail]=b[1][i]+b[0][i];
                b[1][tail]=0;
                b[2][tail]=b[2][i];
                tail++;
                zzzz();
              }else{
              //如果10L和7L杯子加起来补满10L的杯子
                b[0][tail]=10;
                b[1][tail]=b[1][i]+b[0][i]-10;
                b[2][tail]=b[2][i];
                tail++;
                zzzz();
                }
              }  
            if(b[2][i]<3){
            //如果3L的杯子没满
              if(b[1][i]+b[2][i]<3){
              //如果7L和3L杯子加起来不能补满3L的杯子
                b[0][tail]=b[0][i];
                b[1][tail]=0;
                b[2][tail]=b[2][i]+b[1][i];
                tail++;
                zzzz();
              }else{

               //如果7L和3L杯子加起来补满3L的杯子
              b[0][tail]=b[0][i];
              b[1][tail]=b[1][i]+b[2][i]-3;
              b[2][tail]=3;
              tail++;
              zzzz();
              }
            }
          } //7-10 7-3
          if(b[2][i]!=0){
          //如果3L的杯子有酒
        if(b[0][i]<10){
        //如果10L的杯子没满
          if(b[0][i]+b[2][i]<10){
          //如果10L和3L杯子加起来不能补满10L的杯子
            b[0][tail]=b[2][i]+b[0][i];
            b[1][tail]=b[1][i];
            b[2][tail]=0;
            tail++;
            zzzz();
            }else{

             //如果10L和3L杯子加起来能补满3L的杯子
              b[0][tail]=10;
              b[1][tail]=b[1][i];
              b[2][tail]=b[0][i]+b[2][i]-10;
              tail++;
              zzzz();
              }
            }
            if(b[1][i]<7){
            //如果7L的杯子没满
              if(b[2][i]+b[1][i]<7){
              //如果3L和7L杯子加起来不能补满7L的杯子   
              b[0][tail]=b[0][i];
              b[1][tail]=b[1][i]+b[2][i];
              b[2][tail]=0;
              tail++;
              zzzz();
              }else{
              //如果3L和7L杯子加起来补满7L的杯子
                b[0][tail]=b[0][i];
                b[1][tail]=7;
                b[2][tail]=b[2][i]+b[1][i]-7;
                tail++;
                zzzz();
              }
            }
          } //3-7 3-10
        }
      head=bord;
      }
      if(m==1) printf(" %d %d %d %d ",m, b[0][i-1],b[1][i-1],b[2][i-1]);
    }

    欢迎来我们oj刷题 oj地址:http://www.npumdacm.top/
  • 相关阅读:
    checkedListBox 的用发
    C# 控件命名规范
    控件数据及相应的事件处理
    MDI 窗口的创建
    摄像头中运动物体识别
    1
    静态检测大风车初版
    不会难道我还不能附上链接吗
    计算机操作素材
    数字识别
  • 原文地址:https://www.cnblogs.com/tlysMoodspace/p/11832181.html
Copyright © 2011-2022 走看看