zoukankan      html  css  js  c++  java
  • HDU 1495 BFS

    根据题意,既然瓶子没有刻度,那么它们直观的刻度就是他们各自本身的容量。

    一开始的想法漏洞太大,想着填满其中一个容器就行,咳咳。。。 没有仔细想它的模拟过程。  

    答题思路:

    分别看看当前容器能否往外倒,即  >0  如果能的话,看看能倒在哪个容器里。既然只有3个容器,直接暴力就好啦。写的有点麻木。。。

    #include<iostream>
    #include<string>
    #include<string.h>
    #include<stdio.h>
    #include<queue>
    #include<math.h>
    using namespace std;
    int s,n,m,med;
    int vis[110][110][110];
    struct node{
        int tot;
        int x;int y;
        int step;
        friend bool operator < (node a,node b){
            return a.step > b.step;  //升序
        }
    };
    queue<node> q;
    int legal(node t ){
        int cnt=0;
        if(t.tot==med){
            cnt++;
        }
        if(t.x==med){
            cnt++;
        }
        if(t.y==med){
            cnt++;
        }
        if(cnt==2){
            return true;
        }
        return false;
    }
    bool bfs(int &ans){
        node temp,next;
        while(!q.empty()){
            temp=q.front();
            q.pop();
            //cout<<temp.tot<<" "<<temp.x<<" "<<temp.y<<endl;
            if(legal(temp)){
                ans=temp.step;
                return true;
            }
            if(temp.tot>0){
                if(temp.x<n){
                int r=min(temp.tot,n-temp.x);
                next.tot=temp.tot-r;
                next.x=temp.x+r;
                next.y=temp.y;
                next.step=temp.step+1;
                q.push(next);
                if(next.step<vis[next.tot][next.x][next.y]){
                    vis[next.tot][next.x][next.y]=next.step;
                    q.push(next);
                }
             }
             if(temp.y<m){
                int r=min(temp.tot,m-temp.y);
                next.tot=temp.tot-r;
                next.x=temp.x;
                next.y=temp.y+r;
                next.step=temp.step+1;
               if(next.step<vis[next.tot][next.x][next.y]){
                    vis[next.tot][next.x][next.y]=next.step;
                    q.push(next);
                }
    
             }
            }
            if(temp.x>0){
                    if(temp.tot<s){
                        int r=min(temp.x,s-temp.tot);
                        next.tot=temp.tot+r;
                        next.x=temp.x-r;
                        next.y=temp.y;
                        next.step=temp.step+1;
                    if(next.step<vis[next.tot][next.x][next.y]){
                    vis[next.tot][next.x][next.y]=next.step;
                    q.push(next);
                }
            }
                    if(temp.y<m){
                        int r=min(temp.x,m-temp.y);
                        next.tot=temp.tot;
                        next.x=temp.x-r;
                        next.y=temp.y+r;
                        next.step=temp.step+1;
                         if(next.step<vis[next.tot][next.x][next.y]){
                       vis[next.tot][next.x][next.y]=next.step;
                       q.push(next);
                }
            }
    
    
            }
            if(temp.y>0){
                    if(temp.tot<s){
                    int r=min(temp.y,s-temp.tot);
                    next.tot=temp.tot+r;
                    next.x=temp.x;
                    next.y=temp.y-r;
                     next.step=temp.step+1;
                         if(next.step<vis[next.tot][next.x][next.y]){
                       vis[next.tot][next.x][next.y]=next.step;
                       q.push(next);
                }
                    }
                    if(temp.x<n){
                        int r=min(temp.y,n-temp.x);
                            next.tot=temp.tot;
                            next.x=temp.x+r;
                            next.y=temp.y-r;
                             next.step=temp.step+1;
                         if(next.step<vis[next.tot][next.x][next.y]){
                       vis[next.tot][next.x][next.y]=next.step;
                       q.push(next);
                }
                        }
                    }
            }
    
    
        return false;
    }
    int main(){
    
        while(cin>>s>>n>>m){
            if(s==0&&n==0&&m==0) break;
            memset(vis,120,sizeof(vis));
            while(!q.empty()) q.pop();
            if(s%2==1){
                cout<<"NO"<<endl;
                continue;
            }else{
                node tt;
                tt.tot=s;tt.x=0;tt.y=0;tt.step=0;
                q.push(tt);
                med=s/2;
                vis[s][0][0]=0;
                int ans;
                if(bfs(ans)){
                    cout<<ans<<endl;
                }
                else{
                    cout<<"NO"<<endl;
                }
            }
        }
    
        return 0;
    }
  • 相关阅读:
    Windows Console 程序中定时器的使用
    AT91SAM7SE应用 IRQ
    AT91SAM7SE应用 PIT 周期中断(1ms)
    AT91SAM7SE应用 UART
    Modelsim图像处理算法的仿真——图像数据操作
    按照一定的间隔,从视频中截图并保存(OpenCV)
    MacBook Pro下关闭全局网络代理
    jmeter的HTTP取样器设置重连的次数
    【C#】比较 Random 与 RandomNumberGenerator 生成随机字符串
    KendoGrid基础
  • 原文地址:https://www.cnblogs.com/wintersong/p/5239095.html
Copyright © 2011-2022 走看看