100分求解人鬼过河flash小游戏的正确算法

llliiiuuu 2008-11-20 08:57:25
求解人鬼过河flash小游戏的正确算法

或者把我写的源码改好

package game;

import java.util.*;

public class RiverGame {
//人
private final String PERSON = "1";
//鬼
private final String GHOST = "2";
//开始的岸上的人和鬼集合
private List<String> a;
//船上的人和鬼集合
private List<String> b;
//到达的岸上的人和鬼集合
private List<String> c;

public RiverGame() {
init();
}

private void init(){
a = new ArrayList<String>();
for (int i = 0; i < 3; i++) {
a.add(PERSON);
a.add(GHOST);
}
b = new ArrayList<String>();
c = new ArrayList<String>();
}

//获取某一个岸或船上人或鬼的数量
public int getCount(List<String> arg0, String arg1) {
int count = 0;
for (String s : arg0) {
if (arg1.equals(s)) {
count++;
}
}
return count;
}
//打印List的方法
private String show(List<String> s){
StringBuffer ss=new StringBuffer();
for(String s1:s){
ss.append(s1);
}
return ss.toString();
}

//从岸到船
public void transToShip(List<String> arg0, List<String> arg1,List<String> reacher, int direction) {

// 传两人
if ((getCount(arg0, PERSON) - 2 >= getCount(arg0, GHOST))&& (getCount(arg0, PERSON) >= 2) && (arg1.size() == 0)) {
for (int i = 0; i < 2; i++) {
arg0.remove(PERSON);
arg1.add(PERSON);
}
System.out.print("传两人 ");
if (b.size() >= 1) {
crossRiver(arg1, reacher, direction);
}else{
for (int i = 0; i < 2; i++) {
arg0.add(PERSON);
arg1.remove(PERSON);
}
}
}
// 传两鬼
if ((getCount(arg0, PERSON) >= getCount(arg0, GHOST))&& (getCount(arg0, GHOST) >= 2) && (arg1.size() == 0)) {
for (int i = 0; i < 2; i++) {
arg0.remove(GHOST);
arg1.add(GHOST);
}
System.out.print("传两鬼 ");
if (b.size() >= 1) {
crossRiver(arg1, reacher, direction);
}else{
for (int i = 0; i < 2; i++) {
arg0.add(GHOST);
arg1.remove(GHOST);
}
}
}
// 传一人一鬼
if ((getCount(arg0, PERSON) >= getCount(arg0, GHOST))&& (getCount(arg0, GHOST) >= 1) && (arg1.size() == 0)) {
arg0.remove(GHOST);
arg0.remove(PERSON);
arg1.add(GHOST);
arg1.add(PERSON);
System.out.print("传一人一鬼 ");
if (b.size() >= 1) {
crossRiver(arg1, reacher, direction);
}else{
arg0.add(GHOST);
arg0.add(PERSON);
arg1.remove(GHOST);
arg1.remove(PERSON);
}
}
// 传一人
if ((getCount(arg0, PERSON) - 1 >= getCount(arg0, GHOST))&& (getCount(arg0, PERSON) >= 1) && (arg1.size() <= 1)) {
arg0.remove(PERSON);
arg1.add(PERSON);
System.out.print("传一人 ");
if (b.size() >= 1) {
crossRiver(arg1, reacher, direction);
}else{
arg0.add(PERSON);
arg1.remove(PERSON);
}
}
// 传一鬼
if ((getCount(arg0, PERSON) >= getCount(arg0, GHOST))&& (getCount(arg0, GHOST) >= 1) && (arg1.size() <= 1)) {
arg0.remove(GHOST);
arg1.add(GHOST);
System.out.print("传一鬼 ");
if (b.size() >= 1) {
crossRiver(arg1, reacher, direction);
}else{
arg0.add(GHOST);
arg1.remove(GHOST);
}
}
}

//从船到岸
public void transToBank(List<String> arg0, List<String> arg1,List<String> reacher, int direction) {

// 传两人
if (arg1.size() <= 4 && (getCount(arg0, PERSON) == 2)&& (arg0.size() == 2)) {
for (int i = 0; i < 2; i++) {
arg0.remove(PERSON);
arg1.add(PERSON);
}
System.out.print("传两人 ");
crossRiver(arg1, reacher, direction);
}
// 传两鬼
if ((arg1.size() <= 4)&& (((getCount(arg1, PERSON) - 2 >= getCount(arg1, GHOST)) && (getCount(arg1, PERSON) > 0)) || (getCount(arg1, PERSON) == 0))&& (getCount(arg0, GHOST) == 2) && (arg0.size() == 2)) {
for (int i = 0; i < 2; i++) {
arg0.remove(GHOST);
arg1.add(GHOST);
}
System.out.print("传两鬼 ");
crossRiver(arg1, reacher, direction);
}
// 传一人一鬼
System.out.println("船:"+show(arg0));
System.out.println("岸:"+show(arg1));
System.out.println("reacher:"+show(reacher));
System.out.println(direction);
if ((arg1.size() <= 4) && (getCount(arg0, GHOST) == 1)&& (getCount(arg0, PERSON) == 1) && (arg0.size() == 2)) {
arg0.remove(GHOST);
arg0.remove(PERSON);
arg1.add(GHOST);
arg1.add(PERSON);
System.out.print("传一人一鬼 ");
crossRiver(arg1, reacher, direction);
}
// 传一人
if ((arg1.size() <= 5) && (getCount(arg0, PERSON) >= 1)&& (arg0.size() >= 1)) {
arg0.remove(PERSON);
arg1.add(PERSON);
System.out.print("传一人 ");
crossRiver(arg1, reacher, direction);
}
// 传一鬼
if ((arg1.size() <= 5)&& (((getCount(arg1, PERSON) - 2 >= getCount(arg1, GHOST)) && (getCount(arg1, PERSON) > 0)) || (getCount(arg1, PERSON) == 0))&& (getCount(arg0, GHOST) >= 1) && (arg0.size() >= 1)) {
arg0.remove(GHOST);
arg1.add(GHOST);
System.out.print("传一鬼 ");
crossRiver(arg1, reacher, direction);
}

}

public void crossRiver(List<String> arg0, List<String> arg1, int direction) {
if (direction == 1) {
transToShip(arg0, arg1, a, 2);
} else if (direction == 2) {
transToBank(arg0, arg1, b, 3);
} else if (direction == 3) {
transToShip(arg0, arg1, c, 4);
} else if (direction == 4) {
if (c.size() == 6) {
System.out.println("过河了");
return;
}
transToBank(arg0, arg1, b, 1);
}
}

public static void main(String[] args) {
RiverGame gr = new RiverGame();
gr.crossRiver(gr.a, gr.b, 3);
}
}
...全文
1626 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
qs52222 2011-09-29
  • 打赏
  • 举报
回复
真是强人呀 !
iianjian 2009-06-05
  • 打赏
  • 举报
回复
5楼强人啊,不厌其烦的写代码~~~
bigbro001 2008-11-20
  • 打赏
  • 举报
回复
有意思,记号先
JackyNone 2008-11-20
  • 打赏
  • 举报
回复
卧槽
llliiiuuu 2008-11-20
  • 打赏
  • 举报
回复
上面太长了看下面简化后的代码吧

import java.util.*;

public class RiverGame {
//人
private final String PERSON = "1";
//鬼
private final String GHOST = "2";
//开始的岸上的人和鬼集合
private List<String> a;
//船上的人和鬼集合
private List<String> b;
//到达的岸上的人和鬼集合
private List<String> c;

public RiverGame() {
a = new ArrayList<String>();
for (int i = 0; i < 3; i++) {
a.add(PERSON);
a.add(GHOST);
}
b = new ArrayList<String>();
c = new ArrayList<String>();
}

//获取某一个岸或船上人或鬼的数量
public int getCount(List<String> arg0, String arg1) {
int count = 0;
for (String s : arg0) {
if (arg1.equals(s)) {
count++;
}
}
return count;
}
//打印List的方法
private String show(List<String> s){
}

//从岸到船
public void transToShip(List<String> arg0, List<String> arg1,List<String> reacher, int direction) {

// 传两人
...
// 传两鬼
...
// 传一人一鬼
...
// 传一人
...
// 传一鬼
...
}

//从船到岸
public void transToBank(List<String> arg0, List<String> arg1,List<String> reacher, int direction) {
// 传两人
...
// 传两鬼
...
// 传一人一鬼
...
// 传一人
...
// 传一鬼
...
}

public void crossRiver(List<String> arg0, List<String> arg1, int direction) {
if (direction == 1) {
transToShip(arg0, arg1, a, 2);
} else if (direction == 2) {
transToBank(arg0, arg1, b, 3);
} else if (direction == 3) {
transToShip(arg0, arg1, c, 4);
} else if (direction == 4) {
if (c.size() == 6) {
System.out.println("过河了");
return;
}
transToBank(arg0, arg1, b, 1);
}
}

public static void main(String[] args) {
RiverGame gr = new RiverGame();
gr.crossRiver(gr.a, gr.b, 3);
}
}
njzdl 2008-11-20
  • 打赏
  • 举报
回复
代码好长~
shenjie1989 2008-11-20
  • 打赏
  • 举报
回复
有难度的问题,得好好想
weizhao_2008 2008-11-20
  • 打赏
  • 举报
回复
希望楼主最后能够给出实际代码,让我们也学习学习
weizhao_2008 2008-11-20
  • 打赏
  • 举报
回复
这个游戏玩过,具体不知道怎么实现,过程写起来麻烦哦
这样,现在有
1,1,1(代表人) 2,2,2(代表鬼)
一:
两个鬼上船,过河,一鬼下船,然后一个鬼回来(对岸1鬼,船上一鬼,这边3个人,2个鬼)
二:
再一鬼上船,两个鬼过河,一个鬼回来(对岸2个鬼,船上1鬼,这边3个人)
三:
鬼下船,两人上船,两个人过河,下一人,上一鬼,一人一鬼回来(对岸1人1鬼,船上1人1鬼,这边1人1鬼)
四:
鬼下船,一人上船,两个人过河,两人下船,一鬼上船,一鬼回来(对岸3人,船上1鬼,这边2鬼)
五:
鬼依次过河


老大,太难写了,比玩还难,描述起来太恼火了
scusong 2008-11-20
  • 打赏
  • 举报
回复
详细步骤与答案:
1。两鬼上船过河。
2。回来一鬼,在上一鬼,两鬼过去。
3。回来一鬼,鬼上岸。两人上船。
4。上去一人,一鬼下船(这时候,两岸上都是一人一鬼,船上一人一鬼)
5。船上一人一鬼 回来,贵上岸,人上船。两人过去。(这时候,对岸一人一鬼,船上两人,这边岸上两鬼)
6。两人都上岸,鬼下船。鬼回来,再上一鬼。(这时候,对岸三人,船上两鬼人,这边岸上一鬼)
7。上一鬼回来一鬼
8。再上一鬼,两鬼都过去。
9。游戏完成。
llliiiuuu 2008-11-20
  • 打赏
  • 举报
回复
该游戏有且只有一种能过河的方法,肯定会过河成功,我要的是正确的过河步骤
lihan6415151528 2008-11-20
  • 打赏
  • 举报
回复
一分到手,夫妇何求?
scusong 2008-11-20
  • 打赏
  • 举报
回复
我另外写的一个...看看行不?(带参数的那个构造函数可以不要的....用于测试玩的)
import java.util.*;

public class RiverGame {
private boolean sf = true;
private final int pairs;
private final String PERSON = "1"; // 人
private final String GHOST = "2"; // 鬼
private List<String> leftCount; // 开始的岸上的人和鬼集合
private List<String> middleCount; // 船上的人和鬼集合
private List<String> rightCount; // 到达的岸上的人和鬼集合

public RiverGame (){
this(0);
}
public RiverGame (int count) {
if(count<3){
pairs = 3;
}else{
pairs = count;
}
leftCount = new ArrayList<String>();
for (int i = 0; i < pairs; i++) {
leftCount.add(PERSON);
leftCount.add(GHOST);
}
middleCount = new ArrayList<String>();
rightCount = new ArrayList<String>();
}

public int getCount(List<String> list, String name) {
int count = 0;
for (String s : list) {
if (name.equals(s)) {
count++;
}
}
return count;
}

public void leftToMiddle(String str1,String str2,int step){
int personCount = 0;
int ghostCount = 0;
if(str1.equals(PERSON)){
personCount++;
}else{
ghostCount++;
}
leftCount.remove(str1);
middleCount.add(str1);
if(str2 != null&&str2.equals(PERSON)){
personCount++;
leftCount.remove(str2);
middleCount.add(str2);
}else if(str2 != null&&str2.equals(GHOST)){
ghostCount++;
leftCount.remove(str2);
middleCount.add(str2);
}
System.out.println("第"+step+"步:");
System.out.print((personCount>0?personCount+"人":"")+(ghostCount>0?ghostCount+"鬼":"")+"上船 ");
printc("过河 ");
}

public void middleToRight(String str1,String str2){
int personCount = 0;
int ghostCount = 0;
if(str1.equals(PERSON)){
personCount++;
}else{
ghostCount++;
}
middleCount.remove(str1);
rightCount.add(str1);
if(str2 != null&&str2.equals(PERSON)){
personCount++;
middleCount.remove(str2);
rightCount.add(str2);
}else if(str2 != null&&str2.equals(GHOST)){
ghostCount++;
middleCount.remove(str2);
rightCount.add(str2);
}
System.out.print((personCount>0?personCount+"人":"")+(ghostCount>0?ghostCount+"鬼":"")+"上岸; ");
}

public void rightToMiddle(String str){
if(str != null){
rightCount.remove(str);
middleCount.add(str);
System.out.print(1+(str.equals(PERSON)?"人":"鬼")+"上船 ");
}
printc("回来 ");
}

public void middleToLeft(String str){
if(str != null){
middleCount.remove(str);
leftCount.add(str);
System.out.print(1+(str.equals(PERSON)?"人":"鬼")+"上岸 ");
}
System.out.println();
}

private void printc(String s){
int personCount = getCount(middleCount, PERSON);
int ghostCount = getCount(middleCount, GHOST);
System.out.print((personCount>0?personCount+"人":"")+(ghostCount>0?ghostCount+"鬼":"")+" "+s);
if(leftCount.contains(PERSON)&&getCount(leftCount, GHOST)>getCount(leftCount, PERSON)){
sf = false;
}else if(rightCount.contains(PERSON)&&getCount(rightCount, GHOST)>getCount(rightCount, PERSON)){
sf = false;
}
}

public void crossRiver() {
int step = 0;
while(leftCount.size() != 0){
step++;
if(leftCount.size()==pairs*2){
leftToMiddle(GHOST, GHOST,step);
middleToRight(GHOST,null);
rightToMiddle(null);
middleToLeft(null);
}else if(getCount(leftCount, PERSON)-2==getCount(leftCount, GHOST)&&middleCount.size()!=0){
leftToMiddle(GHOST, null,step);
middleToRight(GHOST,null);
rightToMiddle(null);
middleToLeft(GHOST);
}else if(getCount(leftCount, PERSON)-2==getCount(leftCount, GHOST)&&middleCount.size()==0){
leftToMiddle(PERSON, PERSON,step);
middleToRight(PERSON,null);
rightToMiddle(GHOST);
middleToLeft(GHOST);
}
else if(getCount(leftCount, PERSON)>getCount(leftCount, GHOST)){
leftToMiddle(PERSON, null,step);
middleToRight(PERSON,null);
rightToMiddle(null);
middleToLeft(null);
}else if(leftCount.contains(PERSON)){
leftToMiddle(PERSON, null, step);
middleToRight(PERSON,PERSON);
rightToMiddle(GHOST);
middleToLeft(null);
}else{
leftToMiddle(GHOST, null, step);
if(leftCount.size()==0){
middleToRight(GHOST,GHOST);
}else{
middleToRight(GHOST,null);
}
rightToMiddle(null);
middleToLeft(null);
}
if(!sf){
System.out.println("过河失败!!!");
return;
}
}
System.out.println("成功过河了!");
}

public static void main(String[] args) {
RiverGame gr = new RiverGame ();
gr.crossRiver();
}
}

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧