大明子又称小码哥

大明子又称小码哥

羊、狼、农夫过河

题目描述

输入描述

输出描述

源码和解析
解析:

示例代码:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class T34 {
	public static void main(String[] args) {
		String input = "20 8 5";
		int ghostNumber = Integer.parseInt(input.split(" ")[0]);
		int wolfNumber = Integer.parseInt(input.split(" ")[1]);
		int shipCapacity = Integer.parseInt(input.split(" ")[2]);
		List<String> shifLog = new ArrayList<String>();// 转移记录 每次转移一个
		while (ghostNumber + wolfNumber > 0) {
			// 羊或者狼还没运输完 运输时优先确保对岸的羊不比狼少 而本岸的则确保羊比狼多一个即可 由于是单次运输 所以对岸的羊可能会和狼一样多
			if (ghostNumber - wolfNumber > 1) {
				// 运输一个羊
				ghostNumber--;
				shifLog.add("g");
				continue;
			}
			if (wolfNumber > 0) {
				// 否则运输狼
				wolfNumber--;
				shifLog.add("w");
			} else {
				// 只剩一个羊
				ghostNumber--;
				shifLog.add("g");
			}
		}
		System.out.println(shifLog);
		// 来检测单个运输过程 是否可以合并为一次的 求出最小运输次数
		Map<String, Integer> map = new HashMap<String, Integer>();
		map.put("g", 0);
		map.put("w", 0);
		int count = 0; // 运输了几次
		int left = 0;
		int right = shipCapacity;// 第一次运算
		wolfNumber = Integer.parseInt(input.split(" ")[1]);
		shipCapacity = Integer.parseInt(input.split(" ")[2]);
		if (left == right - 1 && ghostNumber - wolfNumber < wolfNumber) {
			// 船容量是1 且羊的数量不是狼的2倍 那么这样是不可能移动成功的
			System.out.println(0);
			System.exit(0);
		}
		while (left < shifLog.size()) {
			int wN = 0;
			int gN = 0;
			int onceCount = 0;
			for (int i = 0; i < right - left; i++) {
				if (left + i >= shifLog.size()) {
					break;
				}
				onceCount++;
				if (shifLog.get(left + i).equals("w")) {
					wN++;
				} else {
					gN++;
				}
			}
			if (map.get("g") + gN > map.get("w") + wN) {
				count++;
				map.put("g", map.get("g") + gN);
				map.put("w", map.get("w") + wN);
				left += onceCount;
				right += shipCapacity;
				// 这是一次有效的运输 指针右移到下一次
				System.out.println("第" + count + "次有效运输,运输的羊和狼为:" + gN + ":"
						+ wN);
			} else {
				right--;
			}
		}
		System.out.println(count);
	}
}

上述代码的执行过程如下图:

华为OD机试之羊、狼、农夫过河(Java源码)-LMLPHP

05-29 16:05