请用JAVA实现牧师野人过河程序的编写,并给出渡河状态过程
时间: 2024-01-21 07:17:17 浏览: 77
以下是JAVA实现牧师野人过河程序的编写:
```
import java.util.*;
public class RiverCrossing {
private int missionaries;
private int cannibals;
private boolean boatOnLeftBank;
public RiverCrossing(int m, int c, boolean boat) {
this.missionaries = m;
this.cannibals = c;
this.boatOnLeftBank = boat;
}
public boolean isGoalState() {
return missionaries == 0 && cannibals == 0 && !boatOnLeftBank;
}
public boolean isValidState() {
if (missionaries < 0 || cannibals < 0) {
return false;
}
if (missionaries > 3 || cannibals > 3) {
return false;
}
if (missionaries > 0 && cannibals > missionaries) {
return false;
}
if (missionaries < 3 && cannibals < missionaries) {
return false;
}
return true;
}
public boolean isLegalState(RiverCrossing nextState) {
if (boatOnLeftBank == nextState.boatOnLeftBank) {
return false;
}
int dm = missionaries - nextState.missionaries;
int dc = cannibals - nextState.cannibals;
if (dm < 0) {
dm = -dm;
}
if (dc < 0) {
dc = -dc;
}
if (dm + dc > 2) {
return false;
}
return nextState.isValidState();
}
public List<RiverCrossing> getNextStates() {
List<RiverCrossing> nextStates = new ArrayList<>();
int d = boatOnLeftBank ? 1 : -1;
for (int m = 0; m <= 2; m++) {
for (int c = 0; c <= 2; c++) {
if (m + c == 0) {
continue;
}
RiverCrossing nextState = new RiverCrossing(missionaries + d * m, cannibals + d * c, !boatOnLeftBank);
if (isLegalState(nextState)) {
nextStates.add(nextState);
}
}
}
return nextStates;
}
public void printState() {
String leftBank = "";
String rightBank = "";
for (int i = 1; i <= 3; i++) {
if (i <= missionaries) {
leftBank += "M";
} else {
leftBank += " ";
}
if (i <= cannibals) {
leftBank += "C";
} else {
leftBank += " ";
}
if (i > 3 - missionaries) {
rightBank += "M";
} else {
rightBank += " ";
}
if (i > 3 - cannibals) {
rightBank += "C";
} else {
rightBank += " ";
}
}
if (boatOnLeftBank) {
System.out.println(leftBank + " | | " + rightBank);
} else {
System.out.println(rightBank + " | | " + leftBank);
}
}
}
```
渡河状态过程如下:
1. 初始状态:3M3C(左岸) | | (右岸)
2. 进行一次合法的渡河操作,得到新状态。根据题目,渡船最多容纳两个人,只有牧师数目不少于野人数目时,渡船才能够行动。因此,我们可以枚举渡船上可能的人数组合,计算出新状态。例如,可以有1M0C、2M0C、0M1C、0M2C、1M1C这5种组合。对于每种组合,我们都要判断它是否合法,即是否满足以下条件:
- 牧师和野人的数目都不能为负数。
- 牧师和野人的数目不能超过3。
- 如果左岸上有牧师,那么野人的数目不能超过牧师的数目。
- 如果左岸上有牧师,但牧师数目不足3,那么野人的数目不能少于牧师的数目。
3. 对于所有合法的新状态,输出它们,并标记它们为已访问状态。
4. 如果有合法的目标状态,输出结果并结束程序;否则,回到第2步,从已经访问过的状态中选择一个未被扩展的状态,作为下一次循环的起点。如果所有状态都已经被扩展过了,那么说明无解,输出结果并结束程序。
阅读全文