hud1495 非常可乐(bfs)

编程入门 行业动态 更新时间:2024-10-04 15:30:44

hud1495 非常<a href=https://www.elefans.com/category/jswz/34/1708915.html style=可乐(bfs)"/>

hud1495 非常可乐(bfs)

就是用队列模拟倒水的情况。。

若s中有水,那么有两种情况,可以给n倒,也可以给m倒  

         1.给n倒 有两种情况

                A.可以倒满

                B.倒不满

         2.给m倒 有两种情况

                A.可以倒满

                B.倒不满

若n中有水。。m中有水,还是上面相同的倒法,输出最少步数

/************************************************ Author: fisty* Created Time: 2015/1/29 15:28:26* File Name   : 1_M.cpp*********************************************** */
#include <iostream>
#include <cstring>
#include <deque>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <algorithm>
using namespace std;
int s,n,m;
int vis[105][105][105];
struct node
{int s,n,m,step;
};
int check(int x,int y,int z)//平分条件
{if(x == 0 && y == z)return 1;if(y == 0 && x == z)return 1;if(z == 0 && x == y)return 1;return 0;
}int bfs()
{queue<node> Q;node a,next;a.s = s;a.n = 0;a.m = 0;a.step = 0;vis[s][0][0] = 1;Q.push(a);while(!Q.empty()){a = Q.front();Q.pop();if(check(a.s,a.n,a.m))return a.step;if(a.n)//当n杯中还有{if(a.n>s-a.s)//将n杯倒入s杯中能将s杯倒满{   //s - a.s 为s还差的量next = a;next.n = next.n-(s-a.s);  //next.s = s;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}else//将n杯倒入s杯中不能将s杯倒满{next = a;next.s = next.n+next.s; //n的水全部倒进snext.n = 0;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}if(a.n>m-a.m)//将n杯倒入m杯中能将m杯倒满{next = a;next.n = next.n-(m-a.m);next.m =  m;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}else//将n杯倒入m杯中不能将m杯倒满{next = a;next.m = next.n+next.m;next.n = 0;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}}if(a.m)//同上{if(a.m>s-a.s){next = a;next.m = next.m-(s-a.s);next.s = s;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}else{next = a;next.s = next.m+next.s;next.m = 0;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}if(a.m>n-a.n){next = a;next.m = next.m-(n-a.n);next.n =  n;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}else{next = a;next.n = next.m+next.n;next.m = 0;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}}if(a.s)//同上{if(a.s>n-a.n){next = a;next.s = next.s-(n-a.n);next.n = n;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}else{next = a;next.n = next.s+next.n;next.s = 0;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}if(a.s>m-a.m){next = a;next.s = next.s-(m-a.m);next.m =  m;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}else{next = a;next.m = next.m+next.s;next.s = 0;if(!vis[next.s][next.n][next.m]){next.step = a.step+1;Q.push(next);vis[next.s][next.n][next.m] = 1;}}}}return 0;
}int main()
{int ans;while(~scanf("%d%d%d",&s,&n,&m),s||n||m){if(s%2)//奇数肯定不能平分,因为被子是整数体积大小{printf("NO\n");continue;}memset(vis,0,sizeof(vis));ans = bfs();if(ans)printf("%d\n",ans);elseprintf("NO\n");}return 0;
}



更多推荐

hud1495 非常可乐(bfs)

本文发布于:2024-02-28 12:27:41,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1769561.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:可乐   bfs

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!