加入收藏 收藏网站 设为首页 设为首页
招生考试网
学历类| 阳光高考 研 究 生 自学考试 成人高考 专 升 本 中考会考 外语类| 四 六 级 职称英语 商务英语 公共英语 日语能力
资格类| 公 务 员 报 关 员 银行从业 司法考试 导 游 证 教师资格 财会类| 会 计 证 经 济 师 会计职称 注册会计 税 务 师
工程类| 一级建造 二级建造 造 价 师 造 价 员 咨 询 师 监 理 师 医学类| 卫生资格 执业医师 执业药师 执业护士 国际护士
计算机| 等级考试 软件水平 应用能力 其它类| 书画等级 美国高考 驾 驶 员 书法等级 少儿英语 报 检 员 单 证 员 出国留学
 招生考试网 - 计算机等级考试 - 考试辅导 - 计算机二级 - 正文

 
看Java如何解决倒油的问题
来源:fjzsksw.com 2010-7-28 编辑:zhanghaifeng 【字体:小 大】
用JAVA解答: 有一位厨师要从12斤油(A桶)倒出6斤油但现在手里只有8斤和5斤的桶,怎么取出6斤

 

用JAVA解答: 有一位厨师要从12斤油(A桶)倒出6斤油但现在手里只有8斤和5斤的桶,怎么取出6斤

  import java.util.ArrayList;

  public class DaoYou {

  public static void main(String[] args) {

  // TODO Auto-generated method stub

  ArrayList<State> stateList = new ArrayList<State>();

  Tong t1 = new Tong("5斤桶",5,0);

  Tong t2 = new Tong("8斤桶",8,0);

  Tong t3 = new Tong("12斤桶",12,12);

  DaoYou dy = new DaoYou();

  State st = new State(t1,t2,t3,0,0);

  stateList.add(st);

  try {

  dy.dao(st, stateList);

  } catch (CloneNotSupportedException e) {

  // TODO Auto-generated catch block

  e.printStackTrace();

  }

  for(int i=0; i< stateList.size(); i++){

  System.out.println(stateList.get(i));

  }

  }

  public boolean dao(State s,ArrayList<State> states) throws CloneNotSupportedException{

  Tong tempT1 = (Tong)s.getT1().clone();

  Tong tempT2 = (Tong)s.getT2().clone();

  Tong tempT3 = (Tong)s.getT3().clone();

  //t1 向 t2 里边倒油

  //还可以对倒油的方法单独拿出来,减少代码的冗余

  if(tempT1.getNow() > 0 && tempT2.getNow()<tempT2.getMax()){

  Tong t1 = (Tong)tempT1.clone();

  Tong t2 = (Tong)tempT2.clone();

  Tong t3 = (Tong)tempT3.clone();

  int temp = (tempT1.getNow() > tempT2.getMax() - tempT2.getNow()) ?

  tempT2.getMax() - tempT2.getNow() : tempT1.getNow();

  t1.setNow(t1.getNow() - temp);

  t2.setNow(t2.getNow() + temp);

  State.NEWID = State.NEWID + 1;

  State st = new State(t1,t2,t3,State.NEWID,s.getId());

  if (states.contains(st)){

  State.NEWID = State.NEWID - 1;

  State tempState = states.get(states.indexOf(st));

  if (s.getId() < tempState.getId()){

  System.out.println("======向前的捷径倒油方法======"+ states.indexOf(st) + "\t" + s + "\t"   + states.get(states.indexOf(st)));

  }else {

  System.out.println("============"+ states.indexOf(st) + "\t" + s + "\t"   + states.get(states.indexOf(st)));

  }

  }else {

  states.add(st);

  //     如果倒油成功,返回

  //     if(t1.getNow() == 6 || t2.getNow() == 6 || t3.getNow() == 6){

  //      return true;

  //     }

  dao(st,states);

  }

  }

  //t2向t1里倒油

  if(tempT2.getNow() > 0 && tempT1.getNow()<tempT1.getMax()){

  Tong t1 = (Tong)tempT1.clone();

  Tong t2 = (Tong)tempT2.clone();

  Tong t3 = (Tong)tempT3.clone();

  int temp = (tempT2.getNow() > tempT1.getMax() - tempT1.getNow()) ?

  tempT1.getMax() - tempT1.getNow() : tempT2.getNow();

  t2.setNow(t2.getNow() - temp);

  t1.setNow(t1.getNow() + temp);

  State.NEWID = State.NEWID + 1;

  State st = new State(t1,t2,t3,State.NEWID,s.getId());

  if (states.contains(st)){

  State.NEWID = State.NEWID - 1;

  State tempState = states.get(states.indexOf(st));

  if (s.getId() < tempState.getId()){

  System.out.println("======向前的捷径倒油方法======"+ states.indexOf(st) + "\t" + s + "\t"   + states.get(states.indexOf(st)));

  }else {

  System.out.println("============"+ states.indexOf(st) + "\t" + s + "\t"   + states.get(states.indexOf(st)));

  }

  }else {

  states.add(st);

  //     如果倒油成功,返回

  //     if(t1.getNow() == 6 || t2.getNow() == 6 || t3.getNow() == 6){

  //      return true;

  //     }

  dao(st,states);

  }

  }

  //t1 向 t3 里边倒油

  if(tempT1.getNow() > 0 && tempT3.getNow()<tempT3.getMax()){

  Tong t1 = (Tong)tempT1.clone();

  Tong t2 = (Tong)tempT2.clone();

  Tong t3 = (Tong)tempT3.clone();

  int temp = (tempT1.getNow() > tempT3.getMax() - tempT3.getNow()) ?

  tempT3.getMax() - tempT3.getNow() : tempT1.getNow();

  t1.setNow(t1.getNow() - temp);

  t3.setNow(t3.getNow() + temp);

  State.NEWID = State.NEWID + 1;

  State st = new State(t1,t2,t3,State.NEWID,s.getId());

  if (states.contains(st)){

  State.NEWID = State.NEWID - 1;

  State tempState = states.get(states.indexOf(st));

  if (s.getId() < tempState.getId()){

  System.out.println("======向前的捷径倒油方法======"+ states.indexOf(st) + "\t" + s + "\t"   + states.get(states.indexOf(st)));

  }else {

  System.out.println("============"+ states.indexOf(st) + "\t" + s + "\t"   + states.get(states.indexOf(st)));

  }

  }else {

  states.add(st);

  //     如果倒油成功,返回

  //     if(t1.getNow() == 6 || t2.getNow() == 6 || t3.getNow() == 6){

  //      return true;

  //     }

  dao(st,states);

  }

  }

  //t3向t1里倒油

  if(tempT3.getNow() > 0 && tempT1.getNow()<tempT1.getMax()){

  Tong t1 = (Tong)tempT1.clone();

  Tong t2 = (Tong)tempT2.clone();

  Tong t3 = (Tong)tempT3.clone();

  int temp = (tempT3.getNow() > tempT1.getMax() - tempT1.getNow()) ?

  tempT1.getMax() - tempT1.getNow() : tempT3.getNow();

  t3.setNow(t3.getNow() - temp);

  t1.setNow(t1.getNow() + temp);

  State.NEWID = State.NEWID + 1;

  State st = new State(t1,t2,t3,State.NEWID,s.getId());

  if (states.contains(st)){

  State.NEWID = State.NEWID - 1;

  State tempState = states.get(states.indexOf(st));

  if (s.getId() < tempState.getId()){

  System.out.println("======向前的捷径倒油方法======"+ states.indexOf(st) + "\t" + s + "\t"   + states.get(states.indexOf(st)));

  }else {

  System.out.println("============"+ states.indexOf(st) + "\t" + s + "\t"   + states.get(states.indexOf(st)));

  }

  }else {

  states.add(st);

  //     如果倒油成功,返回

  //     if(t1.getNow() == 6 || t2.getNow() == 6 || t3.getNow() == 6){

  //      return true;

  //     }

  dao(st,states);

  }

  }

  //t2向t3里倒油

  if(tempT2.getNow() > 0 && tempT3.getNow()<tempT3.getMax()){

  Tong t1 = (Tong)tempT1.clone();

  Tong t2 = (Tong)tempT2.clone();

  Tong t3 = (Tong)tempT3.clone();

  int temp = (tempT2.getNow() > tempT3.getMax() - tempT3.getNow()) ?

  tempT3.getMax() - tempT3.getNow() : tempT2.getNow();

  t2.setNow(t2.getNow() - temp);

  t3.setNow(t3.getNow() + temp);

  State.NEWID = State.NEWID + 1;

  State st = new State(t1,t2,t3,State.NEWID,s.getId());

  if (states.contains(st)){

  State.NEWID = State.NEWID - 1;

  State tempState = states.get(states.indexOf(st));

  if (s.getId() < tempState.getId()){

  System.out.println("======向前的捷径倒油方法======"+ states.indexOf(st) + "\t" + s + "\t"   + states.get(states.indexOf(st)));

  }else {

  System.out.println("============"+ states.indexOf(st) + "\t" + s + "\t"   + states.get(states.indexOf(st)));

  }

  }else {

  states.add(st);

  //     如果倒油成功,返回

  //     if(t1.getNow() == 6 || t2.getNow() == 6 || t3.getNow() == 6){

  //      return true;

  //     }

  dao(st,states);

  }

  }

  //t3向t2里倒油

  if(tempT3.getNow() > 0 && tempT2.getNow()<tempT2.getMax()){

  Tong t1 = (Tong)tempT1.clone();

  Tong t2 = (Tong)tempT2.clone();

  Tong t3 = (Tong)tempT3.clone();

  //    测试 12斤向8斤油 到的 时候,为什么没成功,因为已经包含了该状态

  //    if (t1.getNow() == 0 && t2.getNow() == 0 && t3.getNow() == 12 ){

  //     System.out.println("有执行到此");

  //     for(int i=0; i< states.size(); i++){

  //      System.out.println(states.get(i));

  //     }

  //     System.out.println("=================");

  //

  //    }

  int temp = (tempT3.getNow() > tempT2.getMax() - tempT2.getNow()) ?

  tempT2.getMax() - tempT2.getNow() : tempT3.getNow();

  t3.setNow(t3.getNow() - temp);

  t2.setNow(t2.getNow() + temp);

  State.NEWID = State.NEWID + 1;

  State st = new State(t1,t2,t3,State.NEWID,s.getId());

  if (states.contains(st)){

  State.NEWID = State.NEWID - 1;

  State tempState = states.get(states.indexOf(st));

  if (s.getId() < tempState.getId()){

  System.out.println("======向前的捷径倒油方法======"+ states.indexOf(st) + "\t" + s + "\t"   + states.get(states.indexOf(st)));

  }else {

  System.out.println("============"+ states.indexOf(st) + "\t" + s + "\t"   + states.get(states.indexOf(st)));

  }

  }else {

  states.add(st);

  //     如果倒油成功,返回

  //     if(t1.getNow() == 6 || t2.getNow() == 6 || t3.getNow() == 6){

  //      return true;

  //     }

  dao(st,states);

  }

  }

  return false;

  }

  }

  class State implements Cloneable{

  public static int NEWID = 0;

  private Tong t1;

  private Tong t2;

  private Tong t3;

  private int id;

  private int pid;

  public State(Tong t1, Tong t2, Tong t3, int id, int pid) {

  super();

  this.t1 = t1;

  this.t2 = t2;

  this.t3 = t3;

  this.id = id;

  this.pid = pid;

  }

  public Tong getT1() {

  return t1;

  }

  public void setT1(Tong t1) {

  this.t1 = t1;

  }

  public Tong getT2() {

  return t2;

  }

  public void setT2(Tong t2) {

  this.t2 = t2;

  }

  @Override

  public boolean equals(Object arg0) {

  if(this == arg0){

  return true;

  }

  if (!(arg0 instanceof State)){

  return false;

  }

  State t = (State)arg0;

  if ((this.t1.equals(t.t1) && this.t2.equals(t.t2)) && this.t3.equals(t.t3) ){

  return true;

  }else {

  return false;

  }

  }

  @Override

  public String toString() {

  // TODO Auto-generated method stub

  return this.id + "\t" + this.pid + "\t" + t1.getName() + "当前有" + t1.getNow() + "斤油" + "\t" + t2.getName() + "当前有" + t2.getNow() + "斤油"+ "\t" + t3.getName() + "当前有" + t3.getNow() + "斤油";

  }

  public int getId() {

  return id;

  }

  public void setId(int id) {

  this.id = id;

  }

  public int getPid() {

  return pid;

  }

  public void setPid(int pid) {

  this.pid = pid;

  }

  public Tong getT3() {

  return t3;

  }

  public void setT3(Tong t3) {

  this.t3 = t3;

  }

  }

  class Tong implements Cloneable{

  @Override

  public Object clone() throws CloneNotSupportedException {

  // TODO Auto-generated method stub

  return super.clone();

  }

  private String name;

  private int max;

  private int now;

  @Override

  public boolean equals(Object arg0) {

  // TODO Auto-generated method stub

  if(this == arg0){

  return true;

  }

  if (!(arg0 instanceof Tong)){

  return false;

  }

  Tong t = (Tong)arg0;

  if (this.max == t.max && this.now == t.now){

  return true;

  }else {

  return false;

  }

  }

  public int getMax() {

  return max;

  }

  public void setMax(int max) {

  this.max = max;

  }

  public int getNow() {

  return now;

  }

  public void setNow(int now) {

  this.now = now;

  }

  public String getName() {

  return name;

  }

  public void setName(String name) {

  this.name = name;

  }

  public Tong(String name, int max, int now) {

  super();

  this.name = name;

  this.max = max;

  this.now = now;

  }

  public Tong() {

  super();

  }

  }

 

 



 
网站版权与免责声明
①由于各方面情况的不断调整与变化,本网所提供的相关信息请以权威部门公布的正式信息为准.
②本网转载的文/图等稿件出于非商业性目的,如转载稿涉及版权等问题,请在两周内来电联系.
推荐文章
  • 此栏目下没有推荐文章
  • 热门文章

    报名考试
    全国 | 黑龙江 | 吉林 | 辽宁 | 内蒙古
    青海 | 宁夏 | 甘肃 | 新疆 | 陕西
    西藏 | 北京 | 天津 | 河北 | 山东
    江苏 | 安徽 | 河南 | 上海 | 浙江
    福建 | 广东 | 山西 | 湖南 | 湖北
    江西 | 广西 | 海南 | 云南 | 贵州
    四川 | 重庆
    分省高校计算机考试
    黑龙江 | 吉林 | 辽宁 | 内蒙古 | 河北
    北京 | 天津 | 新疆 | 甘肃 | 宁夏
    青海 | 陕西 | 山西 | 河南 | 山东
    江苏 | 安徽 | 浙江 | 福建 | 广东
    海南 | 广西 | 江西 | 湖北 | 湖南
    四川 | 上海 | 重庆 | 贵州 | 云南
    西藏
    成绩查询
    报考指南
    试题答案
    模拟试题
    考试辅导
    计算机一级 | 计算机二级 | 计算机三级 | 计算机四级
    经验交流
    高校计算机