当前位置: 技术问答>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))
我的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行又没有判断它是否为空就直接用了。
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野人
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
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