倒水问题

http://ff781778304.blog.163.com/blog/static/191291033201191611332761/

/*
*POJ-3414 倒水问题
*提交状态:AC
*思路:题目的意思是选出最快的倒水方案
*要以一个固定的方向倒水,假设从b到a,则有以下几种情况:
1、如果b是空的,则加满
2、如果a中不是满的,则用b中的水尽量将其填满
3、如果a是满的,则将其倒空
*/
#include<cstdio>
int a,b,c;
bool run(char s[][10],int &i,char proc[][10])
{
 int la=0,lb=0,t=1;
 while(t<1000)      //用此条件限制总的步骤数,如果超过了,则说明不能解决问题
 {
  if(lb==c||la==c)  break;  //如果找到了一种倒水方案,则退出
  if(lb==0)
  {
   lb=b;
   sprintf(s[i++],proc[0]);
  }
  else if(la<a)     //a中不满的情况
  {
   sprintf(s[i++],proc[1]); //sprintf函数用法:将字符串proc[1]打印到s[i-1]中去
   int temp=a-la;
   if(lb>=temp)    //如果b中的水足够将a加满,则加满
   {
    la=a;
    lb-=temp;
   }
   else      //否则,将b全部倒入a中
   {
    la+=lb;
    lb=0;
   }
  }
  else if(la==a)     //如果a中是满的,则倒空
  {
   la=0;
   sprintf(s[i++],proc[2]);
  }
  t++;
 }
 if(t>=1000)
  return true;
 return false;
}
int main()
{
 scanf("%d%d%d",&a,&b,&c);
 char sr[10000][10];
 char fr[1000][10];
 char procs[][10]={"FILL(2)","POUR(2,1)","DROP(1)"};  //存储从两个不同方向倒水的方式
 char procf[][10]={"FILL(1)","POUR(1,2)","DROP(2)"};
 int lens=0;
 int lenf=0;
 bool tag1=run(sr,lens,procs);
 bool tag2=run(fr,lenf,procf);
 if(tag1&&tag2)  //如果两种情况下都不能倒出指定水量,则无解
 {
  printf("impossible\n");
  return 0;
 }
 int i;
 if(lens>=lenf)  //否则输出最快的那个方法
 {
  printf("%d\n",lenf);
  for(i=0;i<lenf;i++)
   printf("%s\n",fr[i]);
 }
 else
 {
  printf("%d\n",lens);
  for(i=0;i<lens;i++)
   printf("%s\n",sr[i]);
 }
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值