ZOJ--1005:Jugs(dfs)

xiaoxiao2021-02-28  76

题目大意:两个壶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两种情况)..(妈的。还不如小学生了我还想得这么复杂

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到入B if(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; } } }

转载请注明原文地址: https://www.6miu.com/read-60283.html

最新回复(0)