调酒壶里的酸奶

题目链接(点击)

题目描述

最近小w学了一手调酒的技巧,这么帅的操作,说不定能靠这个俘获女神的芳心,为了在女神面前露一手,他想在学校里建一个"pub",但是显然学校不可能让他真的建一个"pub",那么他退而求次,想建一个"Yogurt shop",不能用酒,那用酸奶也行啊!
今天女神终于来光顾小w的酸奶店了!兴奋的小w拿出自己准备已久每天都仔细擦干净的装备——调酒壶、果汁机、隔冰器和计量杯、砧板、小刀....准备露一手给女神看看
但是女神却没有那么多耐心,女神只是觉得,自己买一瓶大酸奶喝不完,小瓶酸奶不够喝,所以在小w的酸奶店,说不定她可以想买多少就买多少。
于是女神告诉了小w她想要多少体积的酸奶,而小w却依旧想秀一下自己的操作,于是他决定用仅有的两个调酒壶为女神倒出女神想要的酸奶....
小w的两个调酒壶体积是不同的(一开始都是空的),小w每次可以选择一个调酒壶倒入另一个调酒壶(若A倒入B,A倒完或B倒满则停止),或者选择一个调酒壶倒光,或者选择一个调酒壶去接满酸奶.....
满心失望的小w想找一朵花,一瓣一瓣的撕下来,问问花朵女神到底喜不喜欢他...虽然这个答案是显而易见的,但是他还是想找一朵花...然而找花未果,反正花瓣不是偶数就是奇数,那他索性就用自己的操作次数作为花瓣个数吧!(找不到花我还不能脑补一朵吗...)
但是小w已经没有心情去想答案了...那么你能告诉他,需要多少步操作才能倒出女神想要的酸奶吗?

输入

输入包含多组数据,每行三个正整数a,b,c分别表示两个调酒壶的容量以及女神想要的酸奶体积,a,b的范围都在[0,100],c<=max(a,b)

输出

一行包含一个整数表示完成要求的最少操作次数,若达不到则输出"impossible"(没有双引号)

样例输入

10 15 11
6 5 4

样例输出

impossible
4

思路:

之前就搜了好多关于dfs的知识 但似乎没多大用 还是没弄明白

首先判断能不能实现最后的状态:

判断最后所需要的容量n 和两个杯子容量的GCD 能不能整除 如果能整除 就用dfs据需计算 否则输出 impossible

dfs:

很明显有以下几种操作:(括号中是实行该操作的前提条件)

1、 把A杯倒空  (a!=0)

2、把B杯倒空   (b!=0)

3、把A杯倒满   (a!=A)

4、把B杯倒满   (a!=B)

5、把A杯里面的水倒入B杯

①:B杯被倒满  (a+b>=B)

②:A杯被倒空  (a+b < B)

6、把B杯里面的水倒入A杯

两种结果同上

dfs: 罗列条件 -->  dfs下一步 --> 恢复标记

(代码中使用了二维数组进行了标记情况 避免重复出现死循环 但要在dfs后清除标记)

AC代码:

(dfs每种情况使用一个if判断)

#include<stdio.h>
#include<string.h>
const int MAX=1e4;
int A,B,C;
int vis[105][105],sum;
int gcd(int a,int b)
{if(b==0){return a;}return gcd(b,a%b);
}
void dfs(int a,int b,int sum1) //sum1 是用来记录步数的
{if(a==C||b==C){  //returnif(sum>sum1){sum=sum1;}return;}vis[a][b]=1;if(a&&!vis[0][b]){  //将a杯倒空dfs(0,b,sum1+1);vis[0][b]=0;}if(b&&!vis[a][0]){ //将b杯倒空dfs(a,0,sum1+1);vis[a][0]=0;}if(a<A&&!vis[A][b]){ //将a杯倒满dfs(A,b,sum1+1);vis[A][b]=0;}if(b<B&&!vis[a][B]){ //将b杯倒满dfs(a,B,sum1+1);vis[a][B]=0;}if(a+b>=A){  //把a倒满if(!vis[A][a+b-A]){ dfs(A,a+b-A,sum1+1);vis[A][a+b-A]=0;}}else{  //把b倒空if(!vis[a+b][0]){dfs(a+b,0,sum1+1);vis[a+b][0]=0;}}if(a+b>=B){  //把b倒满if(!vis[a+b-B][B]){dfs(a+b-B,B,sum1+1);vis[a+b-B][B]=0;}}else{  //把a倒空if(!vis[0][a+b]){dfs(0,a+b,sum1+1);vis[0][a+b]=0;}}
}
int main()
{while(~scanf("%d%d%d",&A,&B,&C)){if(C%gcd(A,B)==0){sum=MAX;dfs(0,0,0);memset(vis,0,sizeof(vis));printf("%d\n",sum);}else{printf("impossible\n");}}return 0;
}

调酒壶里的酸奶【深度优先搜索】相关推荐

  1. HNUCM 1322 调酒壶里的酸奶 BFS

    1322: 调酒壶里的酸奶 时间限制: 1  内存限制: 128 MB 题目描述 最近小w学了一手调酒的技巧,这么帅的操作,说不定能靠这个俘获女神的芳心,为了在女神面前露一手,他想在学校里建一个&qu ...

  2. 【ZCMU1978】调酒壶里的酸奶(dfs)

    题目链接 1978: 调酒壶里的酸奶 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 158  Solved: 40 [Submit][Status][ ...

  3. zcmu 1978: 调酒壶里的酸奶(数论+dfs)

    [题目] 1978: 调酒壶里的酸奶 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 173  Solved: 48 [Submit][Status][ ...

  4. 调酒壶里的酸奶 DFS

    题目描述 最近小w学了一手调酒的技巧,这么帅的操作,说不定能靠这个俘获女神的芳心,为了在女神面前露一手,他想在学校里建一个"pub",但是显然学校不可能让他真的建一个"p ...

  5. 问题 C: 调酒壶里的酸奶

    题目描述 最近小w学了一手调酒的技巧,这么帅的操作,说不定能靠这个俘获女神的芳心,为了在女神面前露一手,他想在学校里建一个"pub",但是显然学校不可能让他真的建一个"p ...

  6. 【bfs】调酒壶里的酸奶

    题目描述 最近小w学了一手调酒的技巧,这么帅的操作,说不定能靠这个俘获女神的芳心,为了在女神面前露一手,他想在学校里建一个"pub",但是显然学校不可能让他真的建一个"p ...

  7. 调酒壶里的酸奶(bfs)

    题目描述 最近小w学了一手调酒的技巧,这么帅的操作,说不定能靠这个俘获女神的芳心,为了在女神面前露一手,他想在学校里建一个"pub",但是显然学校不可能让他真的建一个"p ...

  8. 调酒壶里的酸奶(DFS)

    题目描述 最近小w学了一手调酒的技巧,这么帅的操作,说不定能靠这个俘获女神的芳心,为了在女神面前露一手,他想在学校里建一个"pub",但是显然学校不可能让他真的建一个"p ...

  9. 问题 C: 调酒壶里的酸奶 BFS

    题目描述 最近小w学了一手调酒的技巧,这么帅的操作,说不定能靠这个俘获女神的芳心,为了在女神面前露一手,他想在学校里建一个"pub",但是显然学校不可能让他真的建一个"p ...

最新文章

  1. 赶上直播电商、在线教育、小程序直播的风口 腾讯音视频解决方案助力
  2. SQL Server中的Merge关键字
  3. C#中的快捷键,可以更方便的编写代码
  4. 【CV】使用OpenCV进行消失点检测(附代码)
  5. Flink SQL Client的datagen的用法(转载+自己验证)
  6. 电力、市政、交通三大领域推动工业交换机行业发展
  7. mongodb 安装、启动
  8. Linux装c编译器gcc,c编译器进阶之路,linux下的gcc c编译器使用教程
  9. [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]
  10. vs winform常用函数_使用.net core3.0 正式版创建Winform程序
  11. 计算机专业创新项目,计算机专业本科生的创新思维
  12. 【Python配置】Win10配置Python3、Numpy、PyCharm、Anaconda
  13. linux重要的目录之proc和dev目录
  14. /proc/sysrq-trigger文件的强大功能 shell
  15. 对应的ctrl_定位神技Ctrl+G,12种常用操作技巧,你都知道吗
  16. 用Java编写考试报名系统_基于jsp的计算机考试报名系统-JavaEE实现计算机考试报名系统 - java项目源码...
  17. mac终端链接阿里云服务器
  18. 华为p40pro android11,华为P40Pro上手对比iPhone11Pro:差距拉开、黑马逆袭!
  19. numpy——arry矩阵交换行或者交换列
  20. Http详解,2021年是做Android开发人员的绝佳时机

热门文章

  1. 写linux代码软件,Linux下写代码神器,完爆notepad++
  2. Pushy入门文档中文翻译
  3. 20210317_23期_集成学习(上)_Task02_sklearn构建完整机器学习模型
  4. java代码:根据年龄,打印出当前年龄的人属于老年、中年、少年
  5. 局域网同一个网段通信过程
  6. JavaScript仿win8高端滑动旋转效果
  7. Python与PHP:有什么区别?
  8. pdf文件预览,有的文件显示空白
  9. linux amd显卡驱动画面撕裂,从此告别画面撕裂 AMD-FreeSync技术解析
  10. 芯片更新!新版华为nova7 SE曝光:搭载天玑800U