鱼C论坛

 找回密码
 立即注册
查看: 2919|回复: 1

[技术交流] 031:非常可乐

[复制链接]
发表于 2018-2-17 14:11:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2018-2-17 14:15:50 | 显示全部楼层
首先要深刻理解BFS,它不止用于地图,迷宫的问题。像这种求状态转移最快的步数或步骤的,就可以用BFS。这题也可以用广搜,以后求最短,最快,最少的问题(等权)都可以往广搜上面想想。。。理解每个”step“的含义,这里每一个step就是在正确的倒水路径上的每一次倒水,一共有6次倒水的方法,让每个“step”做这6个“动作”,然后一直这样往下”各个方向弥漫“,就一定会找到答案。
(注:对方向和步骤的理解不能太死板。要像理解面向对象一样。)

  1. #include<cstdio>
  2. #include<queue>
  3. #define maxn 101

  4. using namespace std;

  5. struct N
  6. {
  7.         int a,b,c;
  8.         int t;
  9. };
  10. queue<N> Q;
  11. bool mark[maxn][maxn][maxn];
  12. void AtoB(int &a,int sa,int &b,int sb)
  13. {
  14.         if(sb-b>=a)
  15.         {
  16.                 b+=a;
  17.                 a=0;
  18.         }
  19.         else
  20.         {
  21.                 a-=sb-b;
  22.                 b=sb;
  23.         }
  24. }
  25. int BFS(int s,int n,int m)
  26. {
  27.         int h=s/2;
  28.         while(!Q.empty())
  29.         {
  30.                 N now=Q.front();
  31.                 Q.pop();
  32.                 int a,b,c;
  33.                 a=now.a;
  34.                 b=now.b;
  35.                 c=now.c;
  36.                 AtoB(a,s,b,n);
  37.                 if(mark[a][b][c]==false)
  38.                 {
  39.                         mark[a][b][c]==true;
  40.                         N tmp;
  41.                         tmp.a=a;
  42.                         tmp.b=b;
  43.                         tmp.c=c;
  44.                         tmp.t=now.t+1;
  45.                         if(a==h&&b==h)
  46.                                 return tmp.t;
  47.                         if(b==h&&c==h)
  48.                                 return tmp.t;
  49.                         if(a==h&&c==h)
  50.                                 return tmp.t;
  51.                         Q.push(tmp);
  52.                 }
  53.                 a=now.a;
  54.                 b=now.b;
  55.                 c=now.c;
  56.                 AtoB(b,n,a,s);
  57.                 if(mark[a][b][c]==false)
  58.                 {
  59.                         mark[a][b][c]==true;
  60.                         N tmp;
  61.                         tmp.a=a;
  62.                         tmp.b=b;
  63.                         tmp.c=c;
  64.                         tmp.t=now.t+1;
  65.                         if(a==h&&b==h)
  66.                                 return tmp.t;
  67.                         if(b==h&&c==h)
  68.                                 return tmp.t;
  69.                         if(a==h&&c==h)
  70.                                 return tmp.t;
  71.                         Q.push(tmp);
  72.                 }
  73.                 a=now.a;
  74.                 b=now.b;
  75.                 c=now.c;
  76.                 AtoB(a,s,c,m);
  77.                 if(mark[a][b][c]==false)
  78.                 {
  79.                         mark[a][b][c]==true;
  80.                         N tmp;
  81.                         tmp.a=a;
  82.                         tmp.b=b;
  83.                         tmp.c=c;
  84.                         tmp.t=now.t+1;
  85.                         if(a==h&&b==h)
  86.                                 return tmp.t;
  87.                         if(b==h&&c==h)
  88.                                 return tmp.t;
  89.                         if(a==h&&c==h)
  90.                                 return tmp.t;
  91.                         Q.push(tmp);
  92.                 }
  93.                 a=now.a;
  94.                 b=now.b;
  95.                 c=now.c;
  96.                 AtoB(c,m,a,s);
  97.                 if(mark[a][b][c]==false)
  98.                 {
  99.                         mark[a][b][c]==true;
  100.                         N tmp;
  101.                         tmp.a=a;
  102.                         tmp.b=b;
  103.                         tmp.c=c;
  104.                         tmp.t=now.t+1;
  105.                         if(a==h&&b==h)
  106.                                 return tmp.t;
  107.                         if(b==h&&c==h)
  108.                                 return tmp.t;
  109.                         if(a==h&&c==h)
  110.                                 return tmp.t;
  111.                         Q.push(tmp);
  112.                 }
  113.                 a=now.a;
  114.                 b=now.b;
  115.                 c=now.c;
  116.                 AtoB(b,n,c,m);
  117.                 if(mark[a][b][c]==false)
  118.                 {
  119.                         mark[a][b][c]==true;
  120.                         N tmp;
  121.                         tmp.a=a;
  122.                         tmp.b=b;
  123.                         tmp.c=c;
  124.                         tmp.t=now.t+1;
  125.                         if(a==h&&b==h)
  126.                                 return tmp.t;
  127.                         if(b==h&&c==h)
  128.                                 return tmp.t;
  129.                         if(a==h&&c==h)
  130.                                 return tmp.t;
  131.                         Q.push(tmp);
  132.                 }
  133.                 a=now.a;
  134.                 b=now.b;
  135.                 c=now.c;
  136.                 AtoB(c,m,b,n);
  137.                 if(mark[a][b][c]==false)
  138.                 {
  139.                         mark[a][b][c]==true;
  140.                         N tmp;
  141.                         tmp.a=a;
  142.                         tmp.b=b;
  143.                         tmp.c=c;
  144.                         tmp.t=now.t+1;
  145.                         if(a==h&&b==h)
  146.                                 return tmp.t;
  147.                         if(b==h&&c==h)
  148.                                 return tmp.t;
  149.                         if(a==h&&c==h)
  150.                                 return tmp.t;
  151.                         Q.push(tmp);
  152.                 }
  153.         }
  154.         return -1;
  155. }
  156. int main()
  157. {
  158.         int s,n,m;
  159.         while(scanf("%d%d%d",&s,&n,&m)!=EOF)
  160.         {
  161.                 if(s==0)
  162.                         break;
  163.                 if(s%2==1)
  164.                 {
  165.                         printf("NO\n");
  166.                         continue;
  167.                 }
  168.                 for(int i=0;i<=s;i++)
  169.                         for(int j=0;j<=n;j++)
  170.                                 for(int k=0;k<=m;k++)
  171.                                         mark[i][j][k]=false;
  172.                 N tmp;
  173.                 tmp.a=s;
  174.                 tmp.b=0;
  175.                 tmp.c=0;
  176.                 tmp.t=0;
  177.                 while(!Q.empty())
  178.                         Q.pop();
  179.                 Q.push(tmp);
  180.                 mark[s][0][0]=true;
  181.                 int rec=BFS(s,n,m);
  182.                 if(rec==-1)
  183.                         printf("NO\n");
  184.                 else
  185.                         printf("%d\n",rec);
  186.         }
  187.         return 0;
  188. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 15:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表