非常可樂 (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; 
 }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章