HDU1495 非常可乐
生活随笔
收集整理的這篇文章主要介紹了
HDU1495 非常可乐
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題鏈接:HDU1495 非常可樂。
參考鏈接:非常可樂。
題意簡述:平分液體問題。輸入s、n和m三個數,分別代表可樂和2個杯子,三個容器可以互相倒,問能不能把s中的可樂平分,能的話輸出最小倒杯子的次數,不能就輸出NO。
問題分析:開始的時候,所有可樂在s中,2個杯子n和m都空著。過程中,可以將任何1個容器中的可樂倒到另外某個容器中,或將目標容器倒滿,或將源容器倒空。因為容器沒有刻度,只能這樣。這個過程中,如果出現某個容器空,另外2個容器可樂相同則成功。如果開始的時候,可樂的容量是奇數,則不可能平分可樂。容器間可樂倒來倒去,每次有6種倒法,對這6種倒法進行試探即可。求的是最少倒的次數,所以可以用BFS實現。
程序說明:搜索過的狀態就不需要再搜索了,用數組notvist[][][]來標記搜索過的狀態。
AC的C++語言程序如下:
/* HDU1495 非常可樂 */#include <iostream> #include <queue> #include <cstring> #include <cstdio>using namespace std;const int MAXN = 100;int s, n, m, s2; bool notvist[MAXN+1][MAXN+1][MAXN+1];struct node {int s, n, m, level; };int bfs() {if(s % 2 == 1)return -1;queue<node> q;s2 = s / 2;memset(notvist, true, sizeof(notvist));node f;f.s = s;f.n = 0;f.m = 0;f.level=0;q.push(f);notvist[f.s][f.n][f.m] = false;while(!q.empty()) {f = q.front();q.pop();if((f.s == f.n && f.s == s2) || (f.s == f.m && f.s == s2) || (f.m == f.n && f.m == s2))return f.level;node v;// s --> nif(f.s && n - f.n > 0) {if(f.s > n - f.n) { // s > n的剩余容量v.s = f.s - (n - f.n);v.n = n;v.m = f.m;} else { // s <= n的剩余容量v.s = 0;v.n = f.n + f.s;v.m = f.m;}if(notvist[v.s][v.n][v.m]) {notvist[v.s][v.n][v.m] = false;v.level = f.level + 1;q.push(v);}}// s --> mif(f.s && m - f.m > 0) {if(f.s > m - f.m) { // s > m的剩余容量v.s = f.s - (m - f.m);v.n = f.n;v.m = m;} else { // s <= m的剩余容量v.s = 0;v.n = f.n;v.m = f.m + f.s;}if(notvist[v.s][v.n][v.m]) {notvist[v.s][v.n][v.m] = false;v.level = f.level + 1;q.push(v);}}// n --> sif(f.n && s - f.s > 0) {if(f.n > s - f.s) { // n > s的剩余容量v.s = s;v.n = f.n - (s - f.s);v.m = f.m;} else { // n <= s的剩余容量v.s = f.s + f.n;v.n = 0;v.m = f.m;}if(notvist[v.s][v.n][v.m]) {notvist[v.s][v.n][v.m] = false;v.level = f.level + 1;q.push(v);}}// n --> mif(f.n && m - f.m > 0) {if(f.n > m - f.m) { // n > m的剩余容量v.s = f.s;v.n = f.n - (m - f.m);v.m = m;} else { // n <= m的剩余容量v.s = f.s;v.n = 0;v.m = f.m + f.n;}if(notvist[v.s][v.n][v.m]) {notvist[v.s][v.n][v.m] = false;v.level = f.level + 1;q.push(v);}}// m --> sif(f.m && s - f.s > 0) {if(f.m > s - f.s) { // m > s的剩余容量v.s = s;v.n = f.n;v.m = f.m - (s - f.s);} else { // m <= s的剩余容量v.s = f.s + f.m;v.n = f.n;v.m = 0;}if(notvist[v.s][v.n][v.m]) {notvist[v.s][v.n][v.m] = false;v.level = f.level + 1;q.push(v);}}// m --> nif(f.m && n - f.n > 0) {if(f.m > n - f.n) { // m > n的剩余容量v.s = f.s;v.n = n;v.m = f.m - (n - f.n);} else { // m <= n的剩余容量v.s = f.s;v.n = f.n + f.m;v.m = 0;}if(notvist[v.s][v.n][v.m]) {notvist[v.s][v.n][v.m] = false;v.level = f.level + 1;q.push(v);}}}return -1; }int main() {while(scanf("%d%d%d", &s, &n, &m) != EOF) {if(s == 0 && n == 0 && m == 0)break;int ans = bfs();if(ans < 0)printf("NO\n");elseprintf("%d\n", ans);}return 0; }
參考鏈接:非常可樂。
轉載于:https://www.cnblogs.com/tigerisland/p/7564390.html
總結
以上是生活随笔為你收集整理的HDU1495 非常可乐的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Wpf TextChanged事件导致死
- 下一篇: SQL Server中的Image数据类