当前位置:  技术问答>java相关

传教士和野人问题,没学过数据结构的人也可以看,解决者另加高分

    来源: 互联网  发布时间:2015-11-15

    本文导语:  问题描述:有3个野人和3个传教士渡河,现在有一艘小船,最多能容两人,无论是在左岸还是右岸,如果野人的数目超过传教士的数目,野人就会吃掉传教士。问怎样才能安全渡河。 我的java菜鸟,刚看了一下数据结...

问题描述:有3个野人和3个传教士渡河,现在有一艘小船,最多能容两人,无论是在左岸还是右岸,如果野人的数目超过传教士的数目,野人就会吃掉传教士。问怎样才能安全渡河。
我的java菜鸟,刚看了一下数据结构,异常处理也没学好,我用链表实现的(可以用栈和队列,我找不到java 关于栈和队列的封装,只好用队列凑火凑火),可惜有NullPointerException错误,不知道怎么解决,如果你有能力解决的话,请写下来修整的方法。
代码:
import java.util.*;
class State{
public State(int a,int b,int c,int d,boolean e){
Lc=a;Ly=b;Rc=c;Ry=d;flag=e;
}
public int getLc(){return Lc;}
public int getLy(){return Ly;}
public int getRc(){return Rc;}
public int getRy(){return Ry;}
public boolean getFlag(){return flag;}
public boolean isLifeSafe(){
if((Lc>=Ly&&Rc>=Ry||Lc>=Ly&&Rc==0||Lc==0&&Rc>=Ry)&&(Ly>=0&&Ry>=0))
return true;
else  return false;
}
private int Lc;
private int Ly;
private int Rc;
private int Ry;
private boolean flag;
}

public class Test{
public static void main(String[] args){
int x=3;int y=3;
int a=0;int b=0;int c=0;int d=0;boolean e=false;
State temp0=null;
State temp1=null;
LinkedList open=new LinkedList();
LinkedList close=new LinkedList();
State atFirst=new State(x,y,0,0,true);
open.add(atFirst);
do{
if(open.isEmpty()){
System.out.println("No Way!");
break;
}
close.add(open.removeFirst());
temp0=(State)(close.getLast());
a=temp0.getLc();b=temp0.getLy();c=temp0.getRc();
d=temp0.getRy();e=temp0.getFlag();
for(int i=0;ijava Test
Exception in thread "main" java.lang.NullPointerException
        at Test.main(Test.java:52)
第52行是:
if(temp1.isLifeSafe()&&!close.contains(temp1)&&!open.contains(temp1))

|
看不懂你的程序,感觉问题出在这:
  if(!(i==0&&j==0||i==1&&j==2||i==2&&j==1||i==2&&j==2))
        if(e==false)
           temp1=new State(a+i,b+j,c-i,d-j,!e);
        else
           temp1=new State(a-i,b-j,c+i,d+j,!e);
temp1就有可能是一个空指针,在52行又没有判断它是否为空就直接用了。

|
实在没有时间看你的程序!不过如果你不知道怎么求数据结构我可以和你说,剩下的自己编写代码吧!不好意思
 
3个传教士 3个野人   左——》右

  1教士 1野人 过河  
  返回 1教士               左 3教士  2野人  右1野人
  2野人      过河
  返回1野人                左 3教士  1野人  右2野人
  2教士      过河
  返回       1教士1野人    左 2教士 2野人    右1教士1野人
  2教士    过河
  返回     1野人           左 3野人         右3教士 
  2野人    过河             
  返回     1野人           左2野人          右3教士 1野人
  2野人 过河               左 0          右3教士3野人 


|
是你的temp1没有初始化,因为那个if里面的知为假,代码我改了一下,逻辑上我没有仔细看,好像不太好懂,只是语法上的逻辑错误我该了一下。
希望对你能有帮助。

|
应该是让程序算出结果吧。
可以用树型结构。

|
package myprojects.example;

import java.util.*;

public class State{
public State(int a,int b,int c,int d,boolean e){
Lc=a;Ly=b;Rc=c;Ry=d;flag=e;
}
public int getLc(){return Lc;}
public int getLy(){return Ly;}
public int getRc(){return Rc;}
public int getRy(){return Ry;}
public boolean getFlag(){return flag;}
public boolean isLifeSafe(){
if((Lc>=Ly&&Rc>=Ry||Lc>=Ly&&Rc==0||Lc==0&&Rc>=Ry)&&(Ly>=0&&Ry>=0))
return true;
else  return false;
}
private int Lc;
private int Ly;
private int Rc;
private int Ry;
private boolean flag;

public String toString(){
return "Lc:"+Lc+"Ly:"+Ly+"Rc:"+Rc+"Ry:"+Ry;
    }

public static void main(String[] args){
int x=3;int y=3;
int a=0;int b=0;int c=0;int d=0;
boolean e=false;
State temp0=null;
State temp1=null;
LinkedList open=new LinkedList();
LinkedList close=new LinkedList();
State atFirst=new State(x,y,0,0,true);
open.add(atFirst);
do{
if(open.isEmpty()){
System.out.println("No Way!");
break;
}
close.add(open.removeFirst());
temp0=(State)(close.getLast());
a=temp0.getLc();b=temp0.getLy();c=temp0.getRc();
d=temp0.getRy();e=temp0.getFlag();
for(int i=0;i

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3