商人过河问题java程序数学模型1617解答董安葳Word文件下载.docx
《商人过河问题java程序数学模型1617解答董安葳Word文件下载.docx》由会员分享,可在线阅读,更多相关《商人过河问题java程序数学模型1617解答董安葳Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
//彼岸的商人数
intyy=0;
//彼岸的仆人数
System.out.println("
请输入商人的个数"
);
Scannerscn=newScanner(System.in);
x=scn.nextInt();
//输入商人的个数
if(x<
=0){//检测用户的错误输入
System.out.println("
输入有误"
return;
}
请输入仆人数量:
"
y=scn.nextInt();
y||y<
=0){
intxuan=0;
//过河决策方案标记
intxuan2=0;
//返回决策方案标记
booleanff=false;
//是否是选择返回方案标记
intinf=0;
//选择过河方案成功与否标记
while(!
(x==0&
&
y==0)){//循环至全部都过河为止
if(ff==true){
xuan=0;
//初始化返回决策方案
if(inf==0){//无适合的过河决策时,回溯返回方案
try{
V.remove(x*10+y);
//弹出记录向量
}
catch(java.lang.ArrayIndexOutOfBoundsExceptione){//不能再弹出了,说明所有的方法都试过了,说明无解
System.out.println("
无解"
return;
y=y+2;
yy=yy-2;
//恢复
xuan2=s.pop().xuann;
//弹出决策方案
//按照弹出的不同的返回决策方案来重新选择,避免了重复的选择
if(xuan2==-1){
xx=xx+1;
x=x-1;
yy=yy-1;
y=y+1;
if((x>
=y&
xx>
=yy)||(x==0)||(xx==0)&
x>
=0&
y>
yy>
(V.indexOf(x*10+y)==-1||(V.size()-V.indexOf(x*10+y))%2!
=0)){//满足不被仆人杀掉,满足没有重复的安排
V.add(x*10+y);
s.push(newdk(0,1,-2));
}
else{
yy=yy+1;
y=y-1;
xx=xx-2;
x=x+2;
if((x>
=0)){
V.add(x*10+y);
s.push(newdk(2,0,-3));
}
else{
xx=xx+2;
x=x-2;
yy=yy-2;
y=y+2;
if((x>
V.add(x*10+y);
s.push(newdk(0,2,-4));
}
else{
yy=yy+2;
y=y-2;
yy=yy-1;
xx=xx-1;
y=y+1;
x=x+1;
if((x>
V.add(x*10+y);
s.push(newdk(1,1,-5));
}
else{//没有合适的返回方案,回溯过河方案
try{
V.remove(x*10+y);
}
catch(java.lang.ArrayIndexOutOfBoundsExceptione){
System.out.println("
return;
yy=yy+1;
xx=xx+1;
y=y-1;
x=x-1;
xuan=s.pop().xuann;
//过河方案的回溯
if(xuan==1){
x=x+1;
y=y+1;
xx=xx-1;
yy=yy-1;
elseif(xuan==2){
x=x+2;
xx=xx-2;
else{
y=y+2;
yy=yy-2;
ff=false;
continue;
elseif(xuan2==-2){
yy=yy+1;
y=y-1;
xx=xx-2;
x=x+2;
s.push(newdk(2,0,-3));
xx=xx+2;
x=x-2;
yy=yy-2;
y=y+2;
s.push(newdk(0,2,-4));
yy=yy+2;
y=y-2;
yy=yy-1;
xx=xx-1;
y=y+1;
x=x+1;
s.push(newdk(1,1,-5));
try{
V.remove(x*10+y);
catch(java.lang.ArrayIndexOutOfBoundsExceptione){
System.out.println("
return;
yy=yy+1;
xx=xx+1;
y=y-1;
x=x-1;
xuan=s.pop().xuann;
if(xuan==1){
x=x+1;
y=y+1;
xx=xx-1;
yy=yy-1;
elseif(xuan==2){
x=x+2;
xx=xx-2;
else{
y=y+2;
yy=yy-2;
ff=false;
continue;
elseif(xuan2==-3){
xx=xx+2;
x=x-2;
yy=yy-2;
y=y+2;
s.push(newdk(0,2,-4));
yy=yy+2;
y=y-2;
yy=yy-1;
xx=xx-1;
y=y+1;
x=x+1;
s.push(newdk(1,1,-5));
try{
V.remove(x*10+y);
catch(java.lang.ArrayIndexOutOfBoundsExceptione){
System.out.println("
return;
yy=yy+1;
xx=xx+1;
y=y-1;
x=x-1;
xuan=s.pop().xuann;
if(xuan==1){
elseif(xuan==2){
x=x+2;
xx=xx-2;
y=y+2;
yy=yy-2;
ff=false;
continue;
elseif(xuan2==-4){
yy=yy+2;
y=y-2;
xx=xx-1;
x=x+1;
s.push(newdk(1,1,-5));
try{
V.remove(x*10+y);
catch(java.lang.ArrayIndexOutOfBoundsExceptione){
System.out.println("
return;
xx=xx+1;
x=x-1;
xuan=s.pop().xuann;
if(xuan==1){
elseif(xuan==2){
x=x+2;
xx=xx-2;
ff=false;
continue;
else{//一定没有合适的返回方案,回溯过河方案
try{
V.remove(x*10+y);
catch(java.lang.ArrayIndexOutOfBoundsExceptione){
System.out.println("
return;
xuan=s.pop().xuann;
if(xuan==1){
elseif(xuan==2){
ff=false;
continue;
}
else{//过河成功,返回方案的设定
xx=xx-1;
x=x+1;
if((x>
V.add(x*10+y);
s.push(newdk(1,0,-1));
else{
}
ff=true;
inf=0;
//此次轮渡成功的标志
//过河方案的设定
x=x-1;
y=y-1;
xx=xx+1;
yy=yy+1;
if(((x>
=yy)||(x==0)||(xx==0))&
xuan<
1&
V.add(x*10+y);
s.push(newdk(1,1,1));
inf=1;
else{
x=x+