zoukankan      html  css  js  c++  java
  • HDU1495 非常可乐 BFS

    题意:

    小明买了一瓶可乐,容量为S,小明有2个杯子,容量分别为N,M,现在小明要把可乐分成体积相等的2部分,问需要几个步骤。

    S,N,M都是整数。

    1.若S为奇数,明显不可以.

    2.若S为偶数,进行BFS.

    vis数组,记录哪些状态出现过。

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<queue>
      4 #include<algorithm>
      5 using namespace std;
      6 const int maxn=101;
      7 bool vis[maxn][maxn][maxn];
      8 int S,N,M;
      9 struct Edge
     10 {
     11     int s,n,m,num;
     12 };
     13 bool judge(int s,int n,int m)
     14 {
     15     if(s==S/2&&n==S/2)
     16         return true;
     17     else if(s==S/2&&m==S/2)
     18         return true;
     19     else if(n==S/2&&m==S/2)
     20         return true;
     21     return false;
     22 }
     23 int bfs(int s)
     24 {
     25     memset(vis,false,sizeof(vis));
     26     queue<Edge>que;
     27     while(!que.empty())
     28         que.pop();
     29     Edge eee;
     30     eee.s=s;
     31     eee.n=0;
     32     eee.m=0;
     33     eee.num=0;
     34     que.push(eee);
     35     vis[s][0][0]=true;
     36     Edge cnt;
     37     while(!que.empty()){
     38         Edge u=que.front();
     39         que.pop();
     40         if(judge(u.s,u.n,u.m))
     41             return u.num;
     42         cnt.s=u.s-min(u.s,N-u.n);
     43         cnt.n=u.n+min(u.s,N-u.n);
     44         cnt.m=u.m;
     45         cnt.num=u.num+1;
     46         if(!vis[cnt.s][cnt.n][cnt.m]){
     47             vis[cnt.s][cnt.n][cnt.m]=true;
     48             que.push(cnt);
     49         }
     50         cnt.s=u.s-min(u.s,M-u.m);
     51         cnt.n=u.n;
     52         cnt.m=u.m+min(u.s,M-u.m);
     53         if(!vis[cnt.s][cnt.n][cnt.m]){
     54             vis[cnt.s][cnt.n][cnt.m]=true;
     55             que.push(cnt);
     56         }
     57         if(u.n+u.s<=S){
     58             cnt.s=u.n+u.s;
     59             cnt.n=0;
     60             cnt.m=u.m;
     61             if(!vis[cnt.s][cnt.n][cnt.m]){
     62                 vis[cnt.s][cnt.n][cnt.m]=true;
     63                 que.push(cnt);
     64             }
     65         }
     66         if(u.n+u.s>S){
     67             cnt.s=S;
     68             cnt.n=u.n+u.s-S;
     69             cnt.m=u.m;
     70             if(!vis[cnt.s][cnt.n][cnt.m]){
     71                 vis[cnt.s][cnt.n][cnt.m]=true;
     72                 que.push(cnt);
     73             }
     74         }
     75         if(u.n+u.m<=M){
     76             cnt.s=u.s;
     77             cnt.n=0;
     78             cnt.m=u.n+u.m;
     79             if(!vis[cnt.s][cnt.n][cnt.m]){
     80                 vis[cnt.s][cnt.n][cnt.m]=true;
     81                 que.push(cnt);
     82             }
     83         }
     84         if(u.n+u.m>M){
     85             cnt.s=u.s;
     86             cnt.n=u.n+u.m-M;
     87             cnt.m=M;
     88             if(!vis[cnt.s][cnt.n][cnt.m]){
     89                 vis[cnt.s][cnt.n][cnt.m]=true;
     90                 que.push(cnt);
     91             }
     92         }
     93         if(u.m+u.s<=S){
     94             cnt.s=u.m+u.s;
     95             cnt.m=0;
     96             cnt.n=u.n;
     97             if(!vis[cnt.s][cnt.n][cnt.m]){
     98                 vis[cnt.s][cnt.n][cnt.m]=true;
     99                 que.push(cnt);
    100             }
    101         }
    102         if(u.m+u.s>S){
    103             cnt.s=S;
    104             cnt.m=u.m+u.s-S;
    105             cnt.n=u.n;
    106             if(!vis[cnt.s][cnt.n][cnt.m]){
    107                 vis[cnt.s][cnt.n][cnt.m]=true;
    108                 que.push(cnt);
    109             }
    110         }
    111         if(u.n+u.m<=N){
    112             cnt.s=u.s;
    113             cnt.m=0;
    114             cnt.n=u.n+u.m;
    115             if(!vis[cnt.s][cnt.n][cnt.m]){
    116                 vis[cnt.s][cnt.n][cnt.m]=true;
    117                 que.push(cnt);
    118             }
    119         }
    120         if(u.n+u.m>N){
    121             cnt.s=u.s;
    122             cnt.m=u.m+u.n-N;
    123             cnt.n=N;
    124             if(!vis[cnt.s][cnt.n][cnt.m]){
    125                 vis[cnt.s][cnt.n][cnt.m]=true;
    126                 que.push(cnt);
    127             }
    128         }
    129 
    130     }
    131     return -1;
    132 }
    133 int main()
    134 {
    135     while(scanf("%d%d%d",&S,&N,&M))
    136     {
    137         if(S==0)
    138             break;
    139         if(S%2)
    140             printf("NO
    ");
    141         else{
    142             int num=bfs(S);
    143             if(num==-1)
    144                 printf("NO
    ");
    145             else
    146                 printf("%d
    ",num);
    147         }
    148     }
    149     return 0;
    150 }
    View Code

     

  • 相关阅读:
    设计工具
    makefile介绍1.0
    cpp命名空间
    第二课 生活智慧
    第一课 我想找到好工作,我想挣钱
    php CURL
    apache 改变文档根目录www的位置
    yii2 模块的创建及使用
    yii2 源码分析Action类分析 (六)
    yii2 源码分析 model类分析 (五)
  • 原文地址:https://www.cnblogs.com/-maybe/p/4376924.html
Copyright © 2011-2022 走看看