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;}}}



原创粉丝点击