非常可乐 (bfs)HDU - 1495

题目大意:有一瓶可乐,已知容积,但是不知道刻度,现在有两个杯子,可以从一个杯子倒到另一个杯子

问最少几次可以把可乐评分 两个杯子容积之和为可乐容积

思路:有大佬推出了公式可以直接推出 次数a/gcd(b,c)-1 如果这个数是偶数则可以输出,不然输出no

另一个就是bfs的,bfs时走法很多,比较繁琐,都是复制粘贴。菜鸡写的很长 还差点超时


#include<stdio.h>
#include<string.h>
int book[105][105][105];
int x,y,z;
struct node{
 		int a;
 		int b;
 		int c;
 		int step;
	 }queue[1000005];
int bfs(int i,int j,int k);
int main(void)
{
	while(scanf("%d%d%d",&x,&y,&z),x&&y&&z){
		if(y<z){
			int t;
			t=y;
			y=z;
			z=t;
		}
		memset(book,0,sizeof(book));
		int ans;
		if(x%2==0)//判断是不是偶数,不是的话直接输出NO
		ans=bfs(x,0,0);
		else
		ans=0;
		if(ans)
		printf("%d\n",ans);
		else
		printf("NO\n");
	}
	return 0;
 } 
 int  bfs(int i,int j,int k){
 	book[i][j][k]=1;
	 int head=0;
	 int tail=1;
	 queue[head].a=i;
	 queue[head].b=j;
	 queue[head].c=k;
	 queue[head].step=0;
	 while(head<tail){
	 	if(queue[head].a==x/2&&queue[head].b==x/2)//判断是不是已经平分
	 	return queue[head].step;
	 	if(queue[head].a!=0){ 
            if(queue[head].a>y-queue[head].b) //下面就是pour,看起来很繁琐,其实都是复制粘贴过去的
            {  
            
           	if(!book[queue[head].a-y+queue[head].b][y][queue[head].c]){
            			queue[tail].a=queue[head].a-y+queue[head].b;
            	queue[tail].b=y;
            	queue[tail].c=queue[head].c; 
            	queue[tail].step=queue[head].step+1;
                book[queue[head].a-y+queue[head].b][y][queue[head].c]=1;
                if(queue[tail].a==x/2&&queue[tail].b==x/2)
	 	return queue[tail].step;
                tail++;
        }
				}
           else
            {  
            	if(!book[0][queue[head].a+queue[head].b][queue[head].c]){
            		queue[tail].a=0;
            	queue[tail].b=queue[head].a+queue[head].b;
            	queue[tail].c=queue[head].c;
            	queue[tail].step=queue[head].step+1;if(queue[tail].a==x/2&&queue[tail].b==x/2)
	 	return queue[tail].step;
            	tail++;
            	book[0][queue[head].a+queue[head].b][queue[head].c]=1; 
            	 
				}
            	
            
        }
            if(queue[head].a>z-queue[head].c) 
            {  
            	if(!book[queue[head].a-z+queue[head].c][queue[head].b][z]){
            		queue[tail].a=queue[head].a-z+queue[head].c;
            	queue[tail].c=z;
            	queue[tail].b=queue[head].b;
            	queue[tail].step=queue[head].step+1;
                book[queue[head].a-z+queue[head].c][queue[head].b][z]=1;if(queue[tail].a==x/2&&queue[tail].b==x/2)
	 	return queue[tail].step;
                tail++;
                
				}
            	
                }  
            
            else 
            {  
            	if(!book[0][queue[head].b][queue[head].a+queue[head].c]){
            		queue[tail].a=0;
            	queue[tail].b=queue[head].b;
            	queue[tail].c=queue[head].a+queue[head].c;
            	queue[tail].step=queue[head].step+1;if(queue[tail].a==x/2&&queue[tail].b==x/2)
	 	return queue[tail].step;
            	tail++;
            	book[0][queue[head].b][queue[head].a+queue[head].c]=1;
				}
            }	
            
        }
           if(queue[head].b!=0){ 
            	if(!book[queue[head].a+queue[head].b][0][queue[head].c]){
            	queue[tail].a=queue[head].a+queue[head].b;
            	queue[tail].b=0;
            	queue[tail].c=queue[head].c; 
            	queue[tail].step=queue[head].step+1;if(queue[tail].a==x/2&&queue[tail].b==x/2)
	 	return queue[tail].step;
            	tail++;
            	book[queue[head].a+queue[head].b][0][queue[head].c]=1;
            }
            if(queue[head].b>(z-queue[head].c)) 
            {  
            	if(!book[queue[head].a][queue[head].b-z+queue[head].c][z]){
            		queue[tail].a=queue[head].a;
            	queue[tail].c=z;
            	queue[tail].b=queue[head].b-z+queue[head].c; 
            	queue[tail].step=queue[head].step+1;
                book[queue[head].a][queue[head].b-z+queue[head].c][z]=1;if(queue[tail].a==x/2&&queue[tail].b==x/2)
	 	return queue[tail].step;
                tail++;
				}
            	
                }   
            else 
            {  
            	if(!book[queue[head].a][0][queue[head].b+queue[head].c]){
            		queue[tail].a=queue[head].a;
            	queue[tail].b=0;
            	queue[tail].c=queue[head].b+queue[head].c;
            	queue[tail].step=queue[head].step+1;if(queue[tail].a==x/2&&queue[tail].b==x/2)
	 	return queue[tail].step;
            	tail++;
            	book[queue[head].a][0][queue[head].b+queue[head].c]=1;
			}
            }  
        }
        if(queue[head].c!=0){ 
            	if(!book[queue[head].a+queue[head].c][queue[head].b][0]){
            	queue[tail].a=queue[head].a+queue[head].c;
            	queue[tail].b=queue[head].b;
            	queue[tail].c=0; 
            	queue[tail].step=queue[head].step+1;
                book[queue[head].a+queue[head].c][queue[head].b][0]=1;if(queue[tail].a==x/2&&queue[tail].b==x/2)
	 	return queue[tail].step;
                tail++;
				}
            if(queue[head].c>(y-queue[head].b)) 
            {  
            	if(!book[queue[head].a][y][queue[head].c-y+queue[head].b]){
            	queue[tail].a=queue[head].a;
            	queue[tail].c=queue[head].c-y+queue[head].b;
            	queue[tail].b=y; 
            	queue[tail].step=queue[head].step+1;
                book[queue[head].a][y][queue[head].c-y+queue[head].b]=1; if(queue[tail].a==x/2&&queue[tail].b==x/2)
	 	return queue[tail].step;
                tail++;
                } 
            }
            else 
            {  
            	if(!book[queue[head].a][queue[head].b+queue[head].c][0]){
            	queue[tail].a=queue[head].a;
            	queue[tail].b=queue[head].b+queue[head].c;
            	queue[tail].c=0;
            	queue[tail].step=queue[head].step+1;  if(queue[tail].a==x/2&&queue[tail].b==x/2)
	 	return queue[tail].step;
            	tail++;
            	book[queue[head].a][queue[head].b+queue[head].c][0]=1;
           		 }  
       		 }
    	}
    
	 	head++;
	 }
	 return 0; 
 }


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值