Problem Description
大家一定覺的運動以后喝可樂是一件很愜意的事情,但是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
?
Author
seeyou
代碼(網上):/*BFS簡單題 Author: shaorui 鏈接地址: http://acm.hdu.edu.cn/showproblem.php?pid=1495 思路:預處理m < n < s,以后處理方便點 初始狀態,m,n杯中可樂體積為0,s杯中體積為s; 然后分六種情況: 1, s 倒 m 2, s 倒 n 3, m 倒 n 4, m 倒 s 5, n 倒 m 6, n 倒 s
隊列中存儲的內容為不同的走法上面可以理解成走迷宮中6種不同的走法,由于最少次數等分情況是可樂瓶和刻度大的杯中等分,因此刻度下的杯子肯定為0,設置限定條件對應每種走法,每種走法有對應6種走法,以此類推直到等分或隊列為空退出。 直到n,s杯中的可樂能等分(此時m杯中體積為0)為止,若不能等分,則輸出 NO
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn 101
bool visited[maxn][maxn];
int m,n,s,si,sj;
struct node
{int x,y,all,t; ?//x,y,all分別表示m,n,s杯中可樂的體積,t表示倒了多少次
};
void BFS()
{queue<node> que;memset(visited,false,sizeof(visited));node p,q;p.x = 0,p.y = 0,p.t = 0,p.all = s;que.push(p);visited[p.x][p.y] = true;while(!que.empty()){p = que.front();que.pop();if(p.y == p.all && p.y == s/2) ? ? ? ? ? ??{printf("%d\n",p.t);return;}if(p.all+p.x > m) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //s倒m{q.x = m,q.y = p.y,q.all = p.all+p.x-m,q.t = p.t+1;if(!visited[q.x][q.y])que.push(q),visited[q.x][q.y] = true;}else{q.x = p.all+p.x,q.y = p.y,q.all = 0,q.t = p.t+1;if(!visited[q.x][q.y])que.push(q),visited[q.x][q.y] = true;}if(p.all+p.y > n) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//s倒n{q.x = p.x, q.y = n, q.all = p.all+p.y-n,q.t = p.t+1;if(!visited[q.x][q.y])que.push(q),visited[q.x][q.y] = true;}else{q.x = p.x,q.y = p.all+p.y,q.all = 0,q.t = p.t+1;if(!visited[q.x][q.y])que.push(q),visited[q.x][q.y] = true;}if(p.x+p.y > n) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?//m倒n{q.x = p.x+p.y-n,q.y = n,q.all = p.all,q.t = p.t+1;?if(!visited[q.x][q.y])que.push(q),visited[q.x][q.y] = true;}else{q.x = 0,q.y = p.x+p.y,q.all = p.all,q.t = p.t+1;if(!visited[q.x][q.y])que.push(q),visited[q.x][q.y] = true;}q.all = p.all+p.x,q.x = 0,q.y = p.y,q.t = p.t+1; //m倒sif(!visited[q.x][q.y])que.push(q),visited[q.x][q.y] = true; ?if(p.x+p.y > m){q.y = p.y+p.x-m,q.x = m,q.all = p.all,q.t = p.t+1;//n倒mif(!visited[q.x][q.y])que.push(q),visited[q.x][q.y] = true;}else{q.x = p.x+p.y,q.y = 0,q.all = p.all,q.t = p.t+1;if(!visited[q.x][q.y])que.push(q),visited[q.x][q.y] = true;}q.all = p.all+p.y,q.x = p.x,q.y = 0,q.t = p.t+1; //n倒sif(!visited[q.x][q.y])que.push(q),visited[q.x][q.y] = true;}printf("NO\n");
}
int main()
{//freopen("1013.txt","r",stdin);while(scanf("%d%d%d",&s,&m,&n) && (s||m||n)){if(s%2){printf("NO\n");continue;}if(m > n) swap(m,n);BFS();}return 0;
}
自己目前還沒有完全寫出來,出來后再附上自己的代碼
總結
以上是生活随笔 為你收集整理的HDU 1495(非常可乐) 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。