java解法

每次船上带的羊和狼的数量总和不能超过船的容量 b。
每个岸上的羊和狼必须遵守狼不多于羊的规则,除非没有羊。
解题步骤:
状态表示:每个状态可以通过 5 个变量表示:

s: 当前岸上剩余的羊的数量。
w: 当前岸上剩余的狼的数量。
b: 船的最大载客数。
opp_s: 已经成功到达对岸的羊的数量。
opp_w: 已经成功到达对岸的狼的数量。
目标:通过递归方式探索所有可能的搬运方案,最少步骤将所有羊和狼都从起始岸搬到对岸。状态变化是递归进行的,每次通过递归检查合法的羊和狼的搬运数量。

合法性检查:

每次船上带的羊和狼的数量必须小于等于船的容量 b。
在当前岸和对岸,不能让狼的数量超过羊的数量,除非羊的数量为零。
防止重复访问相同的状态,避免无意义的计算。
递归策略:使用深度优先搜索(DFS)策略进行递归搜索,记录每种合法搬运方案的步数,最终返回最小的步数

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 读取输入的羊的数量,狼的数量,船的容量
        int s = sc.nextInt();
        int w = sc.nextInt();
        int b = sc.nextInt();
        // 输出最小的步数
        System.out.println(minSteps(s, w, b));
    }

    // 计算最小步数的方法
    public static int minSteps(int s, int w, int b) {
        List<Integer> res = new ArrayList<>();  // 存储结果(所有合法的步数)
        // 从初始状态开始进行递归搜索
        search(s, w, b, 0, 0, 0, res);
        // 如果有合法的结果,返回最小的步数;否则返回0(无法完成任务)
        return res.isEmpty() ? 0 : Collections.min(res);
    }

    // 深度优先搜索(DFS)递归方法
    public static void search(int s, int w, int b, int opp_s, int opp_w, int cnt, List<Integer> res) {
        // 如果所有羊和狼都已到达对岸,记录步数
        if (s == 0 && w == 0) {
            res.add(cnt);  // 记录当前步数
            return;
        }

        // 如果当前岸上的羊和狼的总数不超过船的容量,直接转移并记录步数
        if (s + w <= b) {
            res.add(cnt + 1);
            return;
        }

        // 尝试不同数量的羊和狼一起过河
        for (int i = 0; i <= Math.min(b, s); i++) {  // i表示船上带走的羊的数量
            for (int j = 0; j <= Math.min(b, w); j++) {  // j表示船上带走的狼的数量
                // 如果船上不带任何羊或狼,则跳过
                if (i + j == 0 || i + j > b) continue;
                
                // 检查当前岸上,羊的数量不能小于狼的数量
                if (s - i <= w - j && s - i > 0) continue;
                // 检查对岸,已经过河的羊的数量不能小于狼的数量
                if (opp_s + i <= opp_w + j && opp_s + i > 0) continue;

                // 递归调用,将羊和狼从当前岸搬到对岸,步数加1
                search(s - i, w - j, b, opp_s + i, opp_w + j, cnt + 1, res);
            }
        }
    }
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C++解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

每次船上带的羊和狼的数量总和不能超过船的容量 boat。
每个岸上的羊和狼必须遵守狼不多于羊的规则,除非没有羊。
解题步骤:
状态表示:

s: 当前岸上的羊的数量。
w: 当前岸上的狼的数量。
os: 已经成功到达对岸的羊的数量。
ow: 已经成功到达对岸的狼的数量。
boat: 船的容量。
trips: 当前已执行的步数。
目标:通过递归方式探索所有可能的搬运方案,最少步骤将所有羊和狼从起始岸搬到对岸。每次递归都检查当前是否已经将所有羊和狼成功搬到对岸,如果是,则更新最小的步数。

合法性检查:确保在每个状态下,岸上的羊数量不会少于狼的数量,除非羊已经没有了。

递归策略:使用深度优先搜索(DFS)来模拟每次可能的羊和狼的搬运组合,确保每次递归前都验证当前状态是否合法。

const readline = require("readline");
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });

// 监听输入并开始计算最小步数
rl.on("line", (line) => {
  const [sheep, wolf, boat] = line.split(" ").map(Number);
  console.log(minTrips(sheep, wolf, boat));  // 输出最小的步数
});

// 计算最小步数的函数
function minTrips(sheep, wolf, boat) {
  const res = { min: Infinity };  // 用于存储最小步数的结果,初始化为Infinity
  findTrips(sheep, wolf, 0, 0, boat, 0, res);  // 调用递归函数进行计算
  return res.min === Infinity ? 0 : res.min;  // 如果未找到合法解,返回0;否则返回最小步数
}

// 递归搜索所有可能的搬运方案
function findTrips(s, w, os, ow, boat, trips, res) {
  // 如果所有的羊和狼都已到达对岸,记录步数
  if (s === 0 && w === 0) {
    res.min = Math.min(res.min, trips);  // 更新最小步数
    return;
  }

  // 尝试所有合法的船次:带走i只羊和j只狼
  for (let i = 0; i <= Math.min(boat, s); i++) {  // i表示船上带走的羊的数量
    for (let j = 0; j <= Math.min(boat - i, w); j++) {  // j表示船上带走的狼的数量
      if (i + j === 0) continue;  // 如果船上不带任何动物,则跳过

      // 计算新状态
      const ns = s - i;  // 新的羊的数量
      const nw = w - j;  // 新的狼的数量
      const nos = os + i;  // 已到达对岸的羊的数量
      const now = ow + j;  // 已到达对岸的狼的数量

      // 如果新状态合法,递归进行下一步
      if (validState(ns, nw, nos, now)) {
        findTrips(ns, nw, nos, now, boat, trips + 1, res);
      }
    }
  }
}

// 判断当前状态是否合法
function validState(s, w, os, ow) {
  // 1. 当前岸上羊的数量不能少于狼的数量,除非羊已经没有了
  // 2. 对岸上羊的数量不能少于狼的数量,除非羊已经没有了
  return !(s > 0 && s < w) && !(os > 0 && os < ow);
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/144531898"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!