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/
  • 相关阅读:
    《精通CSS:高级Web标准解决方案》系列(02):可视化格式模型
    《C#入门经典(第5版)》系列(10):定义类成员
    《C#入门经典(第5版)》系列(11):集合、比较和转换
    《锋利的jQuery》系列(01):jQuery选择器
    《C#入门经典(第5版)》系列(09):定义类
    C# 通过搜狐微博api远程更换壁纸
    C# 联网五子棋
    C# 新浪微博群发器
    C# seo测试小工具1:同时更新多网站的博客(csdn,cnblogs,163,sina)
    MS Ajax 客户端编程 学习笔记 (3)
  • 原文地址:https://www.cnblogs.com/tlysMoodspace/p/11832181.html
Copyright © 2011-2022 走看看