• 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

     

  • 相关阅读:
    《剑指offer》第五十五题(平衡二叉树)
    《剑指offer》第五十五题(二叉树的深度)
    《剑指offer》第五十四题(二叉搜索树的第k个结点)
    《剑指offer》第五十三题(数组中数值和下标相等的元素)
    《剑指offer》第五十三题(0到n-1中缺失的数字)
    《剑指offer》第五十三题(数字在排序数组中出现的次数)
    《剑指offer》第五十二题(两个链表的第一个公共结点)
    《剑指offer》第五十一题(数组中的逆序对)
    http://www.cnblogs.com/amylis_chen/archive/2010/07/15/1778217.html
    在做百度地图开发
  • 原文地址:https://www.cnblogs.com/-maybe/p/4376924.html
Copyright © 2020-2023  润新知