HDU

来源:互联网 发布:网络通信协议是如何被 编辑:程序博客网 时间:2024/06/05 09:09

思路:bfs。倒水共有6中情况既(A->B,A->C),(B->A,B->C),(C->A,C->B),我们可以写一个双重循环来模拟这六种情况(当然你也可以把这六种情况一一写出来)。当 i -> j,i给j倒水的时候有两种情况,① i 可以把 j 给装满 ② i 装不满 j 。两种情况不一样记得判断一下即可。标记数组开为3维,每一个维度表示一个杯子。

注意:结束条件为严格的有两个杯子中有S/2的水(比如对于样例二,2 1 1不算结束,必须的2 0 2才可以),且判断条件不能写成S/2,因为7/3 == 2会出错。

#include<bits/stdc++.h>using namespace std;int S[5];struct Node{    int cup[3],step;}NOW, NEXT;bool vis[105][105][105];int bfs(){    memset(vis, 0, sizeof(vis));    queue<Node> q;    NOW.cup[0] = S[0]; NOW.cup[1] = 0; NOW.cup[2] = 0; NOW.step = 0;    vis[S[0]][0][0] = true;    q.push(NOW);    while (!q.empty())    {        NOW = q.front();        q.pop();        if ((NOW.cup[0] * 2 == S[0] && NOW.cup[1] * 2 == S[0]) ||            (NOW.cup[0] * 2 == S[0] && NOW.cup[2] * 2 == S[0]) ||            (NOW.cup[1] * 2 == S[0] && NOW.cup[2] * 2 == S[0]))        {            return NOW.step;        }        for (int i = 0; i < 3; i++)        {            for (int j = 0; j < 3; j++)            {                if (i != j)                {                    NEXT = NOW;                    if (NOW.cup[i] >= S[j] - NOW.cup[j])//i能倒满j                    {                        NEXT.cup[i] = NOW.cup[i] - (S[j] - NOW.cup[j]);                        NEXT.cup[j] = S[j];                    }                    else                    {                        NEXT.cup[i] = 0;                        NEXT.cup[j] = NOW.cup[i] + NOW.cup[j];                    }                    NEXT.step = NOW.step + 1;                    if (!vis[NEXT.cup[0]][NEXT.cup[1]][NEXT.cup[2]])                    {                        vis[NEXT.cup[0]][NEXT.cup[1]][NEXT.cup[2]] = true;                        q.push(NEXT);                    }                }            }        }    }    return -1;}int main(){    while (~scanf("%d%d%d",&S[0], &S[1], &S[2]) && (S[0] + S[1] + S[2]))    {        int ans = bfs();        if (ans != -1) printf("%d\n",ans);        else printf("NO\n");    }    return 0;}/*7 4 34 1 30 0 0*/


阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 人类为蚊子献血 高度近视献血 无偿献血有什么好处 献血400的危害 什么人不能献血 献血对身体的危害 医生透露献血的坏处 献血有什么坏处 献血的危害和好处 献血的危害真的这么大 献血之后注意事项 女生献血的好处和坏处 献血前的注意事项 献血有什么危害 女生献血注意事项 无偿献血的危害 女生献血的危害 献血是不是可以减肥 一次献血多少合适 血压低能献血吗 献血转氨酶高是怎么回事 献血能查出什么病 贫血可以献血吗 献血后会瘦吗 献血一次献多少 献血后吃什么补血 献血一般多少毫升 月经期献血了怎么办 献血会发胖吗 高度近视能献血吗 高血压能献血吗 月经期可以献血吗 献血有钱拿吗 献血后怎么减肥 荨麻疹可以献血吗 献血能不能减肥 近视眼能献血吗 近视眼可以献血吗 甲减可以献血吗 献血之后能喝酒吗 哪里可以献血