zoukankan      html  css  js  c++  java
  • HDU 1495 非常可乐(BFS倒水问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495

    题目大意:只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。如果能将可乐平分则输出倒可乐的最少的次数,如果不能输出"NO"。

    解题思路:题意很坑看了半天,就是要有两个杯子里的可乐都为S/2,S为奇数肯定不能平分的,接下来就模拟倒水(有六个选择)进行BFS,然后用数组记录各杯子里水的量作为状态。

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<queue>
      4 using namespace std;
      5 const int N=105;
      6 int A,B,C,ans;
      7 int vis[N][N][N];
      8 
      9 struct node{
     10     int a,b,c,step;
     11 }pre,now;
     12 
     13 bool bfs(){
     14     queue<node>q;
     15     now.a=A;
     16     now.b=0;
     17     now.c=0;
     18     now.step=0;
     19     vis[A][0][0]=1;
     20     q.push(now);
     21     while(!q.empty()){
     22         pre=q.front();
     23         q.pop();
     24         for(int i=1;i<=6;i++){
     25             int a,b,c;
     26             a=pre.a;
     27             b=pre.b;
     28             c=pre.c;
     29             if(i==1){
     30                 if(a>B-b){
     31                     a-=(B-b);
     32                     b=B;
     33                 }
     34                 else{
     35                     b+=a;
     36                     a=0;    
     37                 }
     38             }
     39             if(i==2){
     40                 a+=b;
     41                 b=0;    
     42             }
     43             if(i==3){
     44                 if(b>C-c){
     45                     b-=(C-c);
     46                     c=C;
     47                 }
     48                 else{
     49                     c+=b;
     50                     b=0;        
     51                 }
     52             }
     53             if(i==4){
     54                 if(c>B-b){
     55                     c-=(B-b);
     56                     b=B;
     57                 }
     58                 else{
     59                     b+=c;
     60                     c=0;
     61                 }
     62             }
     63             if(i==5){
     64                 if(a>C-c){
     65                     a-=(C-c);
     66                     c=C;
     67                 }
     68                 else{
     69                     c+=a;
     70                     a=0;
     71                 }
     72             }
     73             if(i==6){
     74                 a+=c;
     75                 c=0;
     76             }
     77             if(vis[a][b][c])
     78                 continue;
     79             if(b==a&&b==A/2||a==c&&a==A/2){
     80                 ans=pre.step+1;
     81                 return true;
     82             }
     83             vis[a][b][c]=1;
     84             now.a=a;
     85             now.b=b;
     86             now.c=c;
     87             now.step=pre.step+1;
     88             q.push(now);
     89         }
     90     }
     91     return false;
     92 }
     93 
     94 
     95 int main(){
     96     while(~scanf("%d%d%d",&A,&B,&C)){
     97         memset(vis,0,sizeof(vis));
     98         ans=0;
     99         if(A==0&&B==0&&C==0)    
    100             break;
    101         if(A&1)
    102             puts("NO");
    103         else if(bfs())
    104             printf("%d
    ",ans);
    105         else
    106             puts("NO");
    107     }
    108     return 0;
    109 }
  • 相关阅读:
    如何在存储过程中临时设置数据库兼容级别
    PHP中如何防止SQL注入
    Android 源码下载
    HDU 2517 棋盘分割
    OceanBase里面的rowkey是什么概念,是由哪些要素构成的?
    JavaScript的递归之更多例子
    C++库研究笔记——生成一组随机数
    Neutron 如何支持多种 network provider
    理解 Neutron Server 分层模型
    Neutron 物理部署方案
  • 原文地址:https://www.cnblogs.com/fu3638/p/7523901.html
Copyright © 2011-2022 走看看