博客
关于我
编写程序,打印1到100之内的整数,但数字中包含7的要跳过,例如:17、27、71、72
阅读量:144 次
发布时间:2019-02-26

本文共 2527 字,大约阅读时间需要 8 分钟。

老农过河问题是一个经典的算法题目,要求通过最少的过河次数,使猫、狗、鱼安全地到达对岸。以下是解决方案的详细分析和代码实现。

问题分析

老农需要每次只带一只动物过河。当老农不在对岸时,必须确保对岸的动物之间没有冲突。如果对岸存在猫和狗,或者猫和鱼,就会发生不和谐的情况。因此,老农必须在过河前确保对岸的和谐状态。

解决思路

  • 状态判断:分为两种状态,老农在左岸或右岸。
  • 过河逻辑
    • 左岸到右岸:老农在左岸时,必须带动物过河,但必须保证对岸的和谐。若对岸和谐,则可以带动物过河;否则,带动物过河可能导致对岸不和谐,需放弃。
    • 右岸到左岸:老农在右岸时,必须先返回左岸。返回时,如果对岸和谐,则直接返回;否则,需检查对岸动物的顺序,选择可以安全带回的动物。
  • 和谐检查:使用一个方法判断对岸是否和谐,避免猫狗和猫鱼同时存在。
  • 动物顺序:使用队列来管理动物的进入和离开顺序,确保老农总是带最早进入对岸的动物过河。
  • 代码实现

    package com.itheima;
    import java.util.LinkedList;
    public class River {
    LinkedList
    here = new LinkedList<>();
    LinkedList
    there = new LinkedList<>();
    String farmer = "老农";
    String cat = "猫";
    String fish = "鱼";
    String dog = "狗";
    int count = 0;
    public void river() {
    here.add(farmer);
    here.add(cat);
    here.add(fish);
    here.add(dog);
    while (!here.isEmpty()) {
    if (here.contains(farmer)) {
    hereRiver();
    } else {
    thereRiver();
    }
    }
    System.out.println("在河的右岸有" + there);
    }
    private void hereRiver() {
    here.remove(farmer);
    String animal = null;
    while ((animal = here.remove()) != null) {
    if (isHarmony(here)) {
    there.add(farmer);
    there.add(animal);
    System.out.println("第" + ++count + "次: 老农带着(" + animal + ")划船过河的右岸");
    return;
    } else {
    here.add(animal);
    }
    }
    }
    private void thereRiver() {
    there.remove(farmer);
    String animal = null;
    if (isHarmony(there)) {
    System.out.println("第" + ++count + "次: 老农[什么都不带]划船回到河的左岸");
    here.add(farmer);
    } else {
    while ((animal = there.remove()) != null) {
    if (isHarmony(there)) {
    here.add(farmer);
    here.add(animal);
    System.out.println("第" + ++count + "次: 老农带着(" + animal + ")划船回到河的左岸");
    return;
    } else {
    there.add(animal);
    }
    }
    }
    }
    private boolean isHarmony(LinkedList
    list) {
    return !(list.contains(dog) && list.contains(cat)) && !(list.contains(cat) && list.contains(fish));
    }
    }

    代码解释

    • river():初始化左岸和右岸的队列,开始过河循环。
    • hereRiver():老农在左岸时的过河方法,检查对岸和谐状态,决定是否带动物过河。
    • thereRiver():老农在右岸时的过河方法,先返回左岸,检查对岸和谐状态,决定是否带动物回去。
    • isHarmony():检查对岸是否和谐,返回布尔值,用于过河决策。

    通过这种方法,老农可以在最少的过河次数内安全地将所有动物带到对岸,确保对岸的和谐与安全。

    转载地址:http://wmgy.baihongyu.com/

    你可能感兴趣的文章
    Nginx 我们必须知道的那些事
    查看>>
    Nginx 的 proxy_pass 使用简介
    查看>>
    Nginx 的配置文件中的 keepalive 介绍
    查看>>
    Nginx 结合 consul 实现动态负载均衡
    查看>>
    Nginx 负载均衡与权重配置解析
    查看>>
    Nginx 负载均衡详解
    查看>>
    nginx 配置 单页面应用的解决方案
    查看>>
    nginx 配置https(一)—— 自签名证书
    查看>>
    nginx 配置~~~本身就是一个静态资源的服务器
    查看>>
    Nginx 配置清单(一篇够用)
    查看>>
    Nginx 配置解析:从基础到高级应用指南
    查看>>
    nginx+php的搭建
    查看>>
    nginx+tomcat+memcached
    查看>>
    nginx+Tomcat性能监控
    查看>>
    nginx+uwsgi+django
    查看>>
    Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流
    查看>>
    nginx-vts + prometheus 监控nginx
    查看>>
    Nginx下配置codeigniter框架方法
    查看>>
    Nginx之二:nginx.conf简单配置(参数详解)
    查看>>
    Nginx代理websocket配置(解决websocket异常断开连接tcp连接不断问题)
    查看>>