hdu 1495 非常可乐

 

初级bfs

注意对题意的理解。。。

按题目要求的情况,可乐应该被平分在两个杯里。形如s=m+n=half其实是不满足题意的

代码没用queue

hash用的是m*100+n

比较简陋啊。。。

 

 

 

#include<iostream>
#include<set>
using namespace std;
struct water
{
    int s;
    int m;
    int n;
};
water state[400];
int dist[400];  

int bfs(int s,int m,int n);
int main()
{
 
 

 int s,m,n;
 
 for(;cin>>s>>m>>n&&s!=0;)
 {
  int ans;
  if (s%2)  {cout<<"NO\n";continue;}
  if (n==m) {cout<<"1\n";continue;}
  if (n>m)  swap(n,m);// s>m>n
  
  state[1].s=s;
  state[1].m=0;
  state[1].n=0;  
  
  ans=bfs(s,m,n);
  if(ans)
   cout<<dist[ans]<<"\n";
  else cout<<"NO\n";
  
 }
 return 0;
}
int bfs(int s,int m,int n)
{
 
 set<int> ws;
 set<int>::iterator p;
 int half=s/2;
 ws.insert(0);
 int front=1,rear=2;
 //front=0 means no key 
 while(front<rear)
 {
  
  water &c=state[front];
  if(c.s==c.m&&c.s==half)    {return front;}
  int i,news,newm,newn,sum;
  for(i=0;i<6;i++)
  {
   if(i==0)
   {newn=c.n;if((c.s+c.m)>m)   news=c.s+c.m-m,newm=m;           else newm=c.s+c.m,news=0;}
   if(i==1)
   {newm=c.m;if((c.s+c.n)>n)   news=c.s+c.n-n,newn=n;           else newn=c.s+c.n,news=0;}
   if(i==2)
   {newn=c.n;if((c.m+c.s)>s)   newm=c.m+c.s-s,news=s;           else news=c.m+c.s,newm=0;}
   if(i==3)
   {news=c.s;if((c.m+c.n)>n)   newm=c.m+c.n-n,newn=n;           else newn=c.m+c.n,newm=0;}
   if(i==4)
   {newm=c.m;if((c.n+c.s)>s)   newn=c.n+c.s-s,news=s;           else news=c.n+c.s,newn=0;}
   if(i==5)
   {news=c.s;if((c.n+c.m)>m)   newn=c.n+c.m-m,newm=m;           else newm=c.n+c.m,newn=0;}
   
   
   
   sum=newm*100+newn;
   p=ws.find(sum);
   
   
   if(newm<=m&&newn<=n&&news<=s&&p==ws.end())
   {      
    
    water &t=state[rear]; 
    t.s=news,t.m=newm,t.n=newn;  
    dist[rear]=dist[front]+1;
    rear++;
    ws.insert(sum);
   }
  }
  front++;
 }
 return 0;
}


 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值