ZOJ--1005:Jugs(dfs)
来源:互联网 发布:c语言神奇海螺 编辑:程序博客网 时间:2024/05/20 10:22
题目大意:两个壶A和B ,可互相倒水,可加满,可倒空,
输入:Ca Cb N Ca、Cb分别为A B两壶的容量 N为最后B壶所剩水量
输出:操作步骤 pour B A表示从B向A倒水(要么倒满A 要么倒完B) 同理pourA B
最后输出success表示完成
思路:个人感觉做的这几个zoj 全是dfs解决的
我的思路是 每个壶都可以有三个操作 要加满时A(为A壶中所剩的水量)小于Ca 要倒空或向B壶倒水时A大于0.同理B也一样 然后我就用dfs 每次都判断可执行哪个操作
但是若不限制操作步骤会重复某些操作 像加满在倒空再加满再到空....这个题也没要求求最优解 所以只要可以得出最后结果就好 为了可以适用于较大数值用例 我限制操作步数为100 所以每次不管多简单的都会重复知道100步 .......
我在网上看其他人写的 说这其实是移到小学趣味数学..只要B的一直向A中到就可以得到所有想要的结果(但是这里会有 倒满A或者未倒满A两种情况)..(妈的。还不如小学生了我还想得这么复杂)
这是看过网上的以后改的:(都AC但是这个比较简单)
import java.util.Scanner;public class Jugs {static int ca,cb,a,b,n;public static void main(String[] args) {Scanner s=new Scanner(System.in);while(s.hasNext()){ca=s.nextInt();cb=s.nextInt();a=0;b=cb;n=s.nextInt();System.out.println("fill B");dfs();System.out.println("success");}}public static void dfs(){if(b==n){return;}else{if(b>ca){System.out.println("pour B A");b=b-(ca-a);if(b==n)return;System.out.println("empty A");a=0;dfs();}else{System.out.println("pour B A");a=b;System.out.println("fill B");b=cb;dfs();}}}}
这是我之前的:
import java.util.Scanner;public class Jugs {static int ca,cb,a,b,n,sl,find;static String step[]=new String[100];public static void main(String[] args) {Scanner s=new Scanner(System.in);while(s.hasNext()){ca=s.nextInt();cb=s.nextInt();a=0;b=0;sl=0;find=0;n=s.nextInt();dfs();System.out.println("success");}}public static void dfs(){if(find==1||a>ca||b>cb||a<0||b<0||sl>=100)return;if(b==n){for(int i=0;i<sl;i++){System.out.println(step[i]);}find=1;return;}int t=0;//加满if(b<cb){t=cb-b;b+=t;step[sl++]="fill B";dfs();b-=t;sl--;}if(b>0){t=b;//倒空b=0;step[sl++]="empty B";dfs();sl--;b=t;if(a<ca){//倒入A中t=ca-a;if(b>=t){b-=t;a+=t;}else{t=b;a+=b;b=0;}step[sl++]="pour B A";dfs();a-=t;b+=t;sl--;}}if(a<ca){//加满t=ca-a;a+=t;step[sl++]="fill A";dfs();a-=t;sl--;}if(a>0){//A到入Bif(b<cb){t=cb-b;if(a>=t){a-=t;b+=t;}else{t=a;b+=a;a=0;}step[sl++]="pour A B";dfs();b-=t;a+=t;sl--;}t=a;a=0;//倒空step[sl++]="empty A";dfs();sl--;a=t;}}}
阅读全文
0 0
- ZOJ--1005:Jugs(dfs)
- ZOJ 1005 Jugs (DFS)
- ZOJ 1005 Jugs (倒水问题)
- ZOJ 1005 Jugs (演绎推理)
- ZOJ-1005-Jugs
- ZOJ 1005 Jugs
- ZOJ 1005 Jugs
- zoj 1005 Jugs
- zoj 1005 Jugs
- zoj 1005 Jugs
- ZOJ 1005 Jugs 【BFS】
- ZOJ 1005 Jugs
- zoj 1005 jugs
- ZOJ 1005 Jugs
- zoj 1005Jugs
- zoj 1005 Jugs (模拟)
- 模拟 zoj 1005 Jugs
- zoj 1005 Jugs
- 多线程编程之基础概念
- 汇编语言: 用减奇数次数的方法,求一个数的近似平方根,这个平方根是一个整数。
- POJ 1934 Trip 笔记
- 机房收费系统之四(基本数据设定窗体和充值窗体)
- Vue初体验(八)属性和方法
- ZOJ--1005:Jugs(dfs)
- 傅里叶-梅林变换实现图像配准
- map和set
- JAVA Swing日期选择控件datepicker的使用
- Springboot MyBatis多数据源切换
- python strip()函数 介绍
- 移动端开发的简单适配方案
- jilu
- 汇编语言: 以下面形式定义一个长整数,其所占用字节数由 N 得到,试编写一个程序,实现对 N 字节的 NUM 的值求补,并把求补后的值仍保存在 NUM 中。