1. 程式人生 > >1495 非常可樂(BFS)

1495 非常可樂(BFS)

大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子,它們的容量分別是N 毫升和M 毫升 可樂的體積為S (S<101)毫升 (正好裝滿一瓶) ,它們三個之間可以相互倒可樂 (都是沒有刻度的,且 S==N+M,101>S>0,N>0,M>0) 。聰明的ACMER你們說他們能平分嗎?如果能請輸出倒可樂的最少的次數,如果不能輸出"NO"。Input三個整數 : S 可樂的體積 , N 和 M是兩個杯子的容量,以"0 0 0"結束。Output如果能平分的話請輸出最少要倒的次數,否則輸出"NO"。Sample Input
7 4 3
4 1 3
0 0 0
Sample Output
NO
3
思路:六種情況: 1.s往a中倒滿 
                            2.s往b中倒滿 
                            3.a往s中倒滿 
                            4.b往s中倒滿 
                            5.a往b中倒 

                            6.b往a中倒 

通過這六種情況的BFS即可解決這個問題。

程式碼如下:

#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int  s,a,b;
int vis[110][110];

struct node{
	int a,b,s,t;
}nd[110];

int bfs(){
	queue<node> q;
	memset(vis,0,sizeof(vis));
	node st,ed;
	st.a=0;st.b=0;st.s=s;st.t=0;
	q.push(st);
	vis[a][b]=1;
	while(!q.empty()){
		st=q.front();
		if(st.a==s/2&&st.s==s/2)
			return st.t;
		if(st.s&&st.a!=a){//s往a中倒滿 
			int c=a-st.a;
			if(st.s>=c){
				ed.a=a;
				ed.s=st.s-c;
			}
			else{
				ed.s=0;
				ed.a=st.a+st.s;
			}
			ed.b=st.b;
			ed.t=st.t+1;
			if(!vis[ed.a][ed.b]){
				q.push(ed);
				vis[ed.a][ed.b]=1;
			}			
		}
		if(st.s&&st.b!=b){//s往b中倒滿 
			int c=b-st.b;
			if(st.s>=c){
				ed.b=b;
				ed.s=st.s-c;
			}
			else{
				ed.s=0;
				ed.b=st.b+st.s;
			}
			ed.a=st.a;
			ed.t=st.t+1;
			if(!vis[ed.a][ed.b]){
				q.push(ed);
				vis[ed.a][ed.b]=1;
			}
		}
		if(st.a&&st.s!=s){//a往s中倒滿 
			int c=s-st.s;
			if(st.a>=c){
				ed.s=s;
				ed.a=st.a-c;
			}
			else{
				ed.a=0;
				ed.s=st.s+st.a;
			}
			ed.b=st.b;
			ed.t=st.t+1;
			if(!vis[ed.a][ed.b]){
				q.push(ed);
				vis[ed.a][ed.b]=1;
			}
		}
		if(st.b&&st.s!=s){//b往s中倒滿 
			int c=s-st.s;
			if(st.b>=c){
				ed.s=s;
				ed.b=st.b-c;
			}
			else{
				ed.b=0;
				ed.s=st.s+st.b;
			}
			ed.a=st.a;
			ed.t=st.t+1;
			if(!vis[ed.a][ed.b]){
				q.push(ed);
				vis[ed.a][ed.b]=1;
			}
		}
		if(st.a&&st.b!=b){//a往b中倒 
			int c=b-st.b;
			if(st.a>=c){
				ed.b=b;
				ed.a=st.a-c;
			} 
			else{
				ed.a=0;
				ed.b=st.b+st.a;
			}
			ed.s=st.s;
			ed.t=st.t+1;
			if(!vis[ed.a][ed.b]){
				q.push(ed);
				vis[ed.a][ed.b]=1;
			}
		}
		if(st.b&&st.a!=a){//b往a中倒 
			int c=a-st.a;
			if(st.b>=c){
				ed.a=a;
				ed.b=st.b-c;
			} 
			else{
				ed.b=0;
				ed.a=st.a+st.b;
			}
			ed.s=st.s;
			ed.t=st.t+1;
			if(!vis[ed.a][ed.b]){
				q.push(ed);
				vis[ed.a][ed.b]=1;
			}
		}
		q.pop();
	}
	return 0;
}

int main(){
	while(~scanf("%d%d%d",&s,&a,&b)){
		if((s||a||b)==0)
			break;
		if(s%2){
			printf("NO\n");
			continue;
		}
		if(a<b){
			int swap=a;
			a=b;
			b=swap;
		}
		int ans=bfs();
		if(ans)
			printf("%d\n",ans);
		else
			printf("NO\n");
			
	}
	return 0;
} 

相關推薦

HDU 1495 非常可樂 BFS

return sin 相互 目標 ace down ont long read 大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麽認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但

HDU - 1495 非常可樂bfs

ostream pre ios rec scrip miss type span %d 非常可樂 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total

1495 非常可樂BFS

大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子,它們的容量分別是N 毫升和M 毫升 可樂的體積為S

HDU 1495 非常可樂BFS倒水問題

非常可樂 std push pre con scanf col break memset 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 題目大意:只有兩個杯子,它們的容量分別是N 毫升和M 毫升 可樂的體積為S (

HDU 1495 非常可樂不一樣的bfs

非常可樂 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 25387&n

HDU 1495 非常可樂BFS

esp style 模擬操作 pop ace nbsp urn 而且 ane 題目鏈接:https://vjudge.net/problem/HDU-1495 轉載於:https://www.cnblogs.com/ECJTUACM-873284962/p/6750320.

1495 非常可樂bfs

非常可樂 大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要喝的和seeyou一樣多。但seeyou的手中只有兩個杯子,它們的容量分別是N 毫升和M 毫升 可

HDU 1495 - 非常可樂 - [BFS]

ron 整數 難度 求和 div names ems mba color 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 Time Limit: 2000/1000 MS (Java/Others) Memory

HDU 1495 非常可樂 BFS/數論

[0 pac sca 此刻 gin 兩個 妹子 inpu urn M - 非常可樂HDU - 1495 大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麽認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且一定要

HDU - 1495 非常可樂(BFS列舉 or 數論)

題目大意 三個cup,容量分別為s,n,m(s=n+m),cup沒有刻度(這個真的坑,就是要麼倒完要麼倒滿)。初始狀況,s滿,n、m空,求能否通過相互之間倒可樂,把可樂平分。能的話,輸出最小次數。 分析 每次倒都有6種情況s-n,s-m.....。可以BFS分別列舉每種倒

HDU 1495 非常可樂(bfs)

Problem Description 大家一定覺的運動以後喝可樂是一件很愜意的事情,但是seeyou卻不這麼認為。因為每次當seeyou買了可樂以後,阿牛就要求和seeyou一起分享這一瓶可樂,而且

非常可樂多參數bfs模擬

printf div des space cst accep pri esc output 非常可樂 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T

捕牛記1503解題報告bfs

字節數 first 檢測 表示 所有結點 sca c++ fin ++ 解題思路:每到一個坐標點都有三種走法,每個點只走一次,直到第一次發現牛的坐標為止。用廣度優先搜索(Breadth First Search)(bfs) 代碼實現:定義一個標記結點狀態的數組、一個記錄

HDU 1495 非常可樂

tdi gcd stream ret clas amp can mes iostream #include<cstdio> #include<iostream> using namespace std; int gcd(int a,int b) {

三個水杯BFS

post pos acm class .net 一行 ora sea ref 三個水杯 時間限制:1000 ms | 內存限制:65535 KB 難度:4 描寫敘述給出三個水杯。大小不一,而且僅僅有最大的水杯的水是裝滿的,其余兩

BFSHDU 4784 Dinner Coming Soon

same %d mod eas offer pack iostream amp ide   Coach Pang loves his boyfriend Uncle Yang very much. Today is Uncle Yang’s birthday, Coach

CSU-1975 機器人搬重物BFS

技術分享 問題 不能 三種方式 rmi right warning break ont 1975: 機器人搬重物 Time Limit: 1 Sec Memory Limit: 128 Mb Submitted: 64 Solved: 10

層層遞進——寬度優先搜索BFS

一個數 學習 情況 art 打印 能夠 blank alt .cn 問題引入 我們接著上次“解救小哈”的問題繼續探索,不過這次是用寬度優先搜索(BFS)。 註:問題來源可以點擊這裏 http://www.cnblogs.com/Octoptus

饑餓的小易枚舉+廣度優先遍歷BFS

其中 尋找 net inpu 最大 size ron sdn style 題目描述 小易總是感覺饑餓,所以作為章魚的小易經常出去尋找貝殼吃。最開始小易在一個初始位置x_0。對於小易所處的當前位置x,他只能通過神秘的力量移動到 4 * x + 3或者8 * x + 7。因為使

洛谷 P3956 棋盤 BFS

色相 set -c 數據 queue 分享 clu ++ 最小值 題目鏈接:https://www.luogu.org/problemnew/show/P3956 題目: 題目描述 有一個m × m的棋盤,棋盤上每一個格子可能是紅色、黃色或沒有任何顏色的。