倒水问题 bfs

第二周作业 Pour Water

题目:
倒水问题
“fill A” 表示倒满A杯,"empty A"表示倒空A杯,“pour A B” 表示把A的水倒到B杯并且把B杯倒满或A倒空。
输入:
输入包含多组数据。每组数据输入 A, B, C,数据范围 0 < A <= B 、C <= B <=1000 、A和B互质。
输出:
你的程序的输出将由一系列的指令组成。这些输出行将导致任何一个罐子正好包含C单位的水。每组数据的最后一行输出应该是“success”。输出行从第1列开始,不应该有空行或任何尾随空格。
样例输入:
2 7 5
2 7 4
样例输出:
fill B
pour B A
success
fill A
pour A B
fill A
pour A B
success

最初看到这题的时候不能理解为什么能用bfs来做,后来问了下别人才理解:
可以把最初两个水杯的状态看做(0,0)点,由于是2个杯子,有6种操作:1,A倒满 2,B倒满 3,A倒空 4,B倒空 5,A倒入B 6,B倒入A;两个杯子从一个状态到另一个状态可以认为从一个点到另一个点,是依靠6种方法中的一种。如果最后能到达目标状态所代表的的点,则说明是可以依靠这六种方法倒出目标状态的水的。

设一个全局变量int table[1100][1100];
一个初始化函数init,初始化table

void init()
{
   
 for(int i=0;i<1100;i++)
 {
   
  for(int j=0;j<1100;j++)
  {
   
   table[i][j]=0;
  }
 }
}

函数pour,改变两杯水的状态

node pour(int A,int B,node now,int way)
{
   
 int a=now.a;
 int b=now.b;
 node next;
 switch(way)
 {
   
  case 0:
   a=A;//倒满A 
   break;
  case 1:
   b=B;//倒满B 
   break; 
  case 2:
   a=0; 
   break;//清空A 
        case 3: 
   b=0; 
   break;//清空B
  case 4:
   if(a+b>A)//把B中的水倒入A中,判断是否会溢出 
   {
   
    b=a+b-A;
    a=A;
   } 
   else
   {
   
    a=a+b;
    b=0;
   }
   break;
  case 5:
   if(a+b>B)
   {
   
    a=a+b-B;
    b=B;
   }
   else
   {
   
    b=a+b;
    a=0;
   }
   break;
 }
 next.a=a;
 next.b=b;
 next.op=way;
 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值