Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 696|回复: 0

C语言趣味程序百例精解之JAVA实现(77)波瓦松分酒

[复制链接]

该用户从未签到

发表于 2011-9-18 17:04:31 | 显示全部楼层 |阅读模式
C语言趣味程序百例精解之java实现(77)波瓦松分酒趣题


用递归实现了:

import java.io.*;
public class Test{
int V[]={12,8,5};//瓶子容量
int src[] ={0,0,1,1,2,2};//有6种倒酒方法,src[0]->dest[0]表示大瓶往中瓶倒,src[3]->dest[3]表示中瓶往小瓶倒,其它类同.
int dest[]={1,2,0,2,0,1};
  /* 记录分酒步骤的数组:如
   * A     B    C
   * 12    0    0
   * 4     8    0
   * 0     8    4
   * 8     0    4
   * 8     4    0
   * 3     4    5
   * 3     8    1
   * 11    0    1
   * 11    1    0
   * 6     1    5
   * 6     6    0
   */
int record[][]=new int[100][3];
int rec_index=0;
int count=1;//分酒方法的种数
//在控制台和文件中输出
public void Output(PrintWriter pw)
{
   pw.printf("(%d)----------------------------------\n",count);
   System.out.printf("(%d)----------------------------------\n",count);
    pw.printf("    A    B    C\n");
    System.out.printf("    A    B    C\n");
    for(int i=0;i< rec_index;++i){
        System.out.printf("%4d %4d %4d\n",record[0],record[1],record[2]);
        pw.printf("%4d %4d %4d\n",record[0],record[1],record[2]);
     }
   
   
}
public void Record(int state[])//记录步骤
{
    record[rec_index][0]=state[0];
    record[rec_index][1]=state[1];
    record[rec_index][2]=state[2];
    ++rec_index;
}
public boolean Exist(int state[])//是否回到了前一步
{
    for(int i=0;i< rec_index;++i)
        if (state[0]==record[0]
         && state[1]==record[1]
         && state[2]==record[2])
            return true;
    return false;
}
public void Solve(int state[],PrintWriter pw) //递归求解
{
    int a=state[0],b=state[1],c=state[2];
    Record(state);
    if(a==6 && b==6 && c==0) { //找到一种分酒方法,输出
       Output(pw);
       count++;
       return;
    }
    for(int i=0;i< 6;++i)//针对六种倒酒方法,递归求出每一种的所有解。
    {
        if(state[src]==0) continue;//
        Pour(state,src,dest);
        if(!Exist(state))
        {
            Solve(state,pw);
            --rec_index;
        }
        state[0]=a;state[1]=b;state[2]=c;
    }
}
public void Pour(int state[],int x,int y)
{
    int r=V[y]-state[y];//计算y瓶中还可以盛多少酒,y的总容量-y的状态(当时的容量)
    if(state[x]< r) {state[y]+=state[x];state[x]=0;}//将x中的酒全部倒入y
    else {state[y]=V[y];state[x]-=r;}//从x瓶中倒入r品脱酒到y瓶中,此时y瓶满
}
  public static void main(String args[]) throws IOException
{
    //PrintWriter pw=new PrintWriter(new OutputStreamWriter(new FileOutputStream("result.txt")),false);
    File file=new File("result.txt");//将结果写入文件
    PrintWriter pw=new PrintWriter(new FileWriter(file));
    int init[]={12,0,0};
    new Test().Solve(init,pw);
    pw.close();
    }
}
运行结果:
(1)----------------------------------
    A    B    C
  12    0    0
   4    8    0
   0    8    4
   8    0    4
   8    4    0
   3    4    5
   3    8    1
  11    0    1
  11    1    0
   6    1    5
   6    6    0
(2)----------------------------------
    A    B    C
  12    0    0
   4    8    0
   4    3    5
   0    7    5
   7    0    5
   7    5    0
   2    5    5
   2    8    2
   0    8    4
   8    0    4
   8    4    0
   3    4    5
   3    8    1
  11    0    1
  11    1    0
   6    1    5
   6    6    0
(3)----------------------------------
。。。。。。。。。。。。。。。。。。。。。。。
(120)----------------------------------
    A    B    C
  12    0    0
   7    0    5
   7    5    0
   2    5    5
   2    8    2
   4    8    0
   4    3    5
   9    3    0
   9    0    3
   1    8    3
   1    6    5
   0    7    5
   0    8    4
   8    0    4
   8    4    0
   3    4    5
   3    8    1
  11    0    1
  11    1    0
   6    1    5
   6    6    0
(121)----------------------------------
    A    B    C
  12    0    0
   7    0    5
   7    5    0
   2    5    5
   2    8    2
   4    8    0
   4    3    5
   9    3    0
   9    0    3
   1    8    3
   1    6    5
   6    6    0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2025-1-10 22:40 , Processed in 0.399697 second(s), 47 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表