三妖怪,三和尚过河问题(美图2017线下笔试题)
来源:互联网 发布:柯赛特的肖像知乎 编辑:程序博客网 时间:2024/04/30 03:19
//三个妖怪和三个和尚过河,当一边的和尚数小于妖怪数,则和尚被吃,找出过河方案
package cn.edu.wtu.test;
public class Test {final static int MOSTER = 3; // 妖怪数final static int MONK = 3; // 和尚数private static int path[] = new int[20]; // 保存河左边的妖怪和和尚数(妖怪*10+和尚)/** * 过河 * * @param goMoster 过河的妖怪数 * @param goMonk 过河的和尚数 * @param L_moster 过河前左边妖怪数 * @param L_monk 过河前左边和尚数 * @param cnt 存放path下标 * @return */public static boolean goTo(int goMoster, int goMonk, int L_moster, int L_monk, int cnt) {// 过河后 左边妖怪,和尚数L_moster -= goMoster;L_monk -= goMonk;// 全部过河,输出过河方法,负数表示返回if (L_moster == 0 && L_monk == 0) {for (int i = 0; path[i] != 0; ++i) {int moster = path[i] / 10 - path[i + 1] / 10;int monk = path[i] % 10 - path[i + 1] % 10;System.out.println("第" + i + "次:" + moster + "妖怪 " + monk + "和尚过河");}return true;}// 过河后 判断左岸是否满足条件if (L_moster > L_monk && L_monk != 0) {return false;}// 得到右岸妖怪,和尚数int R_moster = MOSTER - L_moster;int R_monk = MONK - L_monk;// 判断右岸妖怪和尚是否满足条件if (R_moster > R_monk && R_monk != 0) {return false;}int tmp = L_moster * 10 + L_monk;// 防止重复,出现死循环for (int i = 1; i < cnt; i += 2) {if (tmp == path[i]) {return false;}}path[cnt++] = tmp;// 返回左岸for (int i = 0; i <= R_moster && i <= 1; ++i) {for (int j = 0; j <= 1 && j <= R_monk; ++j) {if (i + j > 0) {if (goBack(i, j, R_moster, R_monk, cnt)) {return true;}}}}return false;}public static boolean goBack(int backMoster, int backMonk, int R_moster, int R_monk, int cnt) {R_moster -= backMoster;R_monk -= backMonk;if (R_moster > R_monk && R_monk != 0) {return false;}int L_moster = MOSTER - R_moster;int L_monk = MONK - R_monk;if (L_moster > L_monk && L_monk != 0) {return false;}int tmp = L_moster * 10 + L_monk;for (int i = 0; i < cnt; i += 2) {if (tmp == path[i]) {return false;}}path[cnt++] = tmp;// 过河for (int i = 0; i <= L_moster && i <= 2; ++i) {for (int j = 0; j <= L_monk && j <= 2; ++j) {if (i + j > 0 && goTo(i, 2 - i, L_moster, L_monk, cnt)) {return true;}}}return false;}public static void main(String[] args) {int i;int cnt = 0;path[cnt++] = MOSTER * 10 + MONK; // 初始状态,左岸3和尚3妖怪for (i = 0; i <= 2; ++i) {for (int j = 0; j <= 2; ++j) {if (i + j > 0 && goTo(i, j, MOSTER, MONK, cnt)) {return;}}}if (i > 2) {System.out.println("无解");}}}
1 0
- 三妖怪,三和尚过河问题(美图2017线下笔试题)
- 算法系列之三:妖怪与和尚过河问题
- 算法系列之三:妖怪与和尚过河问题
- 算法系列之三:妖怪与和尚过河问题
- 算法系列之三:妖怪与和尚过河问题
- 算法系列之三:妖怪与和尚过河问题
- 妖怪与和尚过河问题(java语言)
- 算法系列:妖怪与和尚过河问题
- 大写金额转换小写数字金额(美图2017线下笔试题)
- 状态树搜索算法再现————妖怪与和尚过河问题
- 三人三鬼过河问题
- 三商人三仆人过河问题
- 过河问题(牛虎过河、商人仆人过河、农夫妖怪过河、传教士野人过河)(第2届第2题)
- 三人三鬼过河问题的解
- 关于三只母鸡和三只小鸡过河问题
- 广联达线下笔试题
- (三)17分钟过河记
- unity3d 瞎子过河,速度慢,小问题,都要搞半天。--(三)
- FFmpeg图解:flv_read_packet()
- 源码阅读
- 蓝桥杯JAVA语言B组_九数组分数
- 【Java SE】正则表达式
- Windows下本地RabbitMQ服务的安装(V3.01)
- 三妖怪,三和尚过河问题(美图2017线下笔试题)
- AS中build.gradle文件配置讲解
- 数据库 GROUP BY 语句的操作方式
- 房间安排
- Nginx 源码阅读笔记3 时间管理
- 功能开发-quartz定时器完成积分变动提醒功能
- map containsKey与get方法区别经典总结
- Leetcode--14. Longest Common Prefix
- FFmpeg图解:parse_packet