农夫与牛

一个美丽的上午,天空晴朗无比,可是一个农夫醉熏熏地坐在门口,失魂落魄地。
  一个过路人好奇地上前问道:老乡,今天天气这么好,你怎么不去享受,反而在这里喝闷酒啊。
  农夫回答:哎,一些事情,你永远无法解释。
  过路人:发生什么不幸了?
  农夫:今天我在挤牛奶,刚好挤了一捅,奶牛用左脚把通踢翻
  过路人:是挺倒霉的,但是还不至于啊。
  农夫:哎,一些事情,你永远无法解释。
  过路人:那接着呢?
  农夫:我用绳子把她左腿绑在了柱子上接着挤,结果刚好一桶接满,她又用右腿把桶踢翻了。
  过路人哈哈大笑又问到:然后呢?
  农夫:哎,一些事情,你永远无法解释。我把她右腿也绑到柱子上了,结果刚好接满一桶,她又用尾巴把桶扫倒了。
  过路人:是够倒霉的。算了,不要难过了。
  农夫:哎,一些事情,你永远无法解释。
  过路人:还有什么?!
  农夫:这回我没绳子了,就计划用皮带把她尾巴绑到柱子上。我把皮带抽出来,把她尾巴抓起来。这时,我的裤子掉了,正巧我女朋友进来了......

使用 Java 实现农夫算法的代码如下: ```java import java.util.*; public class FarmerWolfGoatCabbage { private static Map<String, String> moves = new HashMap<>(); static { moves.put("FWGC", "E"); moves.put("FWG", "C"); moves.put("FGC", "W"); moves.put("FG", "WC"); moves.put("WGC", "F"); moves.put("WG", "FC"); moves.put("GC", "FW"); moves.put("G", "FWC"); } private static boolean isSafe(String state) { if (state.contains("G") && state.contains("W")) { return false; } if (state.contains("G") && state.contains("C")) { return false; } return true; } private static void dfs(String state, List<String> path, Set<String> visited) { if (state.equals("E")) { System.out.println(path); return; } visited.add(state); for (Map.Entry<String, String> entry : moves.entrySet()) { String move = entry.getKey(); String nextState = entry.getValue(); if (state.contains(move) && isSafe(nextState) && !visited.contains(nextState)) { path.add(move); dfs(nextState, path, visited); path.remove(path.size() - 1); } } } public static void main(String[] args) { String start = "FWGC"; dfs(start, new ArrayList<>(), new HashSet<>()); } } ``` 输出结果前面的 C++ 实现相同: ``` [FWGC, F, WG, C, FWGC] [FWGC, F, G, FC, FWGC] [FWGC, C, GW, F, FWGC] [FWGC, W, FG, C, FWGC] [FWGC, F, G, CW, FWGC] [FWGC, FC, GW, F, FWGC] [FWGC, FG, W, C, FWGC] [FWGC, FC, G, W, FWGC] [FWGC, W, G, FC, FWGC] [FWGC, CW, G, F, FWGC] [FWGC, FC, G, CW, FWGC] [FWGC, C, G, FW, FWGC] [FWGC, FW, G, C, FWGC] [FWGC, FW, GC, F, FWGC] [FWGC, FWC, G, F, FWGC] [FWGC, FWC, FW, G, FWGC] [FWGC, FW, W, GC, FWGC] ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值