HDU-OJ 杭电1495非常可乐

#include "stdio.h"
#include "queue"
#include "cstring" 
using namespace std;

struct node{
    int num[3];
    int output;
}now,nex;

int vis[101][101][101];
int rq[3];//最大容量 

bool check(node x){
    if((x.num[0] == x.num[1] && x.num[2] == 0 )||(x.num[0] == x.num[2] && x.num[1] == 0)||
    (x.num[1] == x.num[2] && x.num[0] == 0)){
        return true;
    }
    return false;
}

void bfs(int ss, int n, int m){
    queue<node>s;
    memset(vis,0,sizeof(vis));
    now.num[0] = ss;
    now.num[1] = n;
    now.num[2] = m;
    vis[ss][n][m] = 1; //记录当前的这种情况我已经访问了 
    now.output = 0; //记录层数 
    s.push(now);
    while(!s.empty()){
        now = s.front();
        if(check(now)){
            printf("%d\n",now.output);
            return ;
        }
        s.pop();
        for(int i = 0; i < 3; i++){
            for(int j = 0; j < 3; j++){
                if(i == j) continue;
                if(now.num[i] <= rq[j]-now.num[j]){//如果能倒光 
                    nex.num[j] = now.num[j] + now.num[i];
                    nex.num[i] = 0;
                }
                else{//如果不能倒光 
                    nex.num[i] = now.num[i] - (rq[j]-now.num[j]);
                    nex.num[j] = rq[j];
                }
                //另外一个不变 
                for(int ii=0;ii<3;ii++)  
                {  
                    if(ii==i||ii==j)  
                    continue;  
                    nex.num[ii]=now.num[ii];  
                }  
                //层次加一 ,千万别写成now.output++!!! 
                nex.output = now.output + 1;
                //记忆化状态             
                if(vis[nex.num[0]][nex.num[1]][nex.num[2]]==0){
                    vis[nex.num[0]][nex.num[1]][nex.num[2]]=1;
                    s.push(nex);
                }
            }
        }
    }
    printf("NO\n");
    return ;
}

int main(){
    int s, n, m;
    while(scanf("%d%d%d",&s,&n,&m)!=EOF && s!=0 && n!=0 && m!=0){
        if(s & 1){
            printf("NO\n"); 
        }
        else {
            rq[0] = s;
            rq[1] = n;
            rq[2] = m;
            bfs(s,0,0); 
        }
    }
    return 0;
} 

这里注意的是会结构体中++是对.后面的加加,而不是整体,还有题目的理解很重要。本体是BFS的经典题型。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值