三妖怪,三和尚过河问题(美图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