HDU - 1495 非常可乐 (bfs)

Posted tianwell

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU - 1495 非常可乐 (bfs)相关的知识,希望对你有一定的参考价值。

题意:还是倒水问题:给出三个瓶子容积为 A,B,C :A =B+C;然后问倒几次才能够使其中两个瓶子中水相同且平分已有的水。一开始A瓶被装满水

思路:像装水这种操作的问题就是模拟,而dfs能够解决最少操作问题(通过记录操作数)

 

完整代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
int s[3] , vis[105][105][105];
 
struct cup
  int v[3] , step;
now;
 
int bfs()
  queue<cup> q ;
  now.v[0] = s[0] ,now.v[1] = now.v[2] = now.step = 0;
  vis[now.v[0]][now.v[1]][now.v[2]] = 1;
  q.push(now);
  while(!q.empty())
    now = q.front();
    if((now.v[0] == now.v[1] && now.v[2] == 0) || (now.v[0] == now.v[2] && now.v[1] == 0) || (now.v[1] == now.v[2] && now.v[0] == 0))
    //判断终止条件,即有一个杯子是空,另外两个杯子一样多
    
      return now.step;
    
    q.pop();
    for(int i = 0 ; i < 3 ; i ++)
      //模拟倒水的 6 种情况 a 倒 b,c  ||  b倒 a , c   || c 倒 a , b
        for(int j = 0 ; j < 3 ; j ++)
        if(i != j) // 非自己倒给自己的过程,即其他的倒水过程
          int k = s[j] - now.v[j];
          if(k > now.v[i])
            k = now.v[i];
          
          cup next = now;
          //第 i 杯往第 j 杯里倒水过程
          next.v[i] = now.v[i] - k;
          next.v[j] = now.v[j] + k;
          next.step = now.step + 1;
          if(vis[next.v[0]][next.v[1]][next.v[2]] == 0)
            vis[next.v[0]][next.v[1]][next.v[2]] = 1;
            q.push(next);
          
        
      
    
  
  return -1;

 
int main()
  while(cin >> s[0] >> s[1] >> s[2] )
      if(!(s[0] + s[1] + s[2])) break;  
    memset(vis,0,sizeof(vis));
    if(s[0] != s[1] + s[2])
      printf("NO\n");
      break;
    
    else
      int ans = bfs();
      if(ans == -1)
        printf("NO\n");
      else
        printf("%d\n",ans);
    
  
  return 0 ;

 

以上是关于HDU - 1495 非常可乐 (bfs)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1495 - 非常可乐 - [BFS]

HDU 1495 非常可乐(BFS倒水问题)

HDU - 1495 非常可乐(bfs)

HDU 1495 非常可乐(bfs)

HDU 1495 非常可乐 (BFS)

HDU 1495 非常可乐(数论,BFS)