商人过河问题java程序数学模型1617解答董安葳.docx
- 文档编号:3929818
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:19
- 大小:96.15KB
商人过河问题java程序数学模型1617解答董安葳.docx
《商人过河问题java程序数学模型1617解答董安葳.docx》由会员分享,可在线阅读,更多相关《商人过河问题java程序数学模型1617解答董安葳.docx(19页珍藏版)》请在冰豆网上搜索。
商人过河问题java程序数学模型1617解答董安葳
数学模型第一次作业——董安葳
5123119董安葳
1.程序设计(Java语言):
本人设计的程序的特色是可以让用户随意设定商人和仆人的数量(商人数大于仆人数),船的载人数为2人。
本程序使用栈记录决策,使用向量记录一岸的商人数,采用遍历加回溯的方式实现。
代码行数:
440行。
importjava.util.Scanner;
importjava.util.Stack;
importjava.util.Vector;
publicclassBuiness{
publicstaticvoidmain(String[]args){
Stack
Vector
intx;//此岸的商人个数
inty;//此岸的仆人个数
intxx=0;//彼岸的商人数
intyy=0;//彼岸的仆人数
System.out.println("请输入商人的个数");
Scannerscn=newScanner(System.in);
x=scn.nextInt();//输入商人的个数
if(x<=0){//检测用户的错误输入
System.out.println("输入有误");
return;
}
System.out.println("请输入仆人数量:
");
y=scn.nextInt();
if(x System.out.println("输入有误"); return; } 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>=0&&xx>=0&&yy>=0&&(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>=y&&xx>=yy)||(x==0)||(xx==0)&&x>=0&&y>=0&&xx>=0&&yy>=0&&(V.indexOf(x*10+y)==-1||(V.size()-V.indexOf(x*10+y))%2! =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>=y&&xx>=yy)||(x==0)||(xx==0)&&x>=0&&y>=0&&xx>=0&&yy>=0&&(V.indexOf(x*10+y)==-1||(V.size()-V.indexOf(x*10+y))%2! =0)){ 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>=y&&xx>=yy)||(x==0)||(xx==0)&&x>=0&&y>=0&&xx>=0&&yy>=0&&(V.indexOf(x*10+y)==-1||(V.size()-V.indexOf(x*10+y))%2! =0)){ 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; if((x>=y&&xx>=yy)||(x==0)||(xx==0)&&x>=0&&y>=0&&xx>=0&&yy>=0&&(V.indexOf(x*10+y)==-1||(V.size()-V.indexOf(x*10+y))%2! =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>=y&&xx>=yy)||(x==0)||(xx==0)&&x>=0&&y>=0&&xx>=0&&yy>=0&&(V.indexOf(x*10+y)==-1||(V.size()-V.indexOf(x*10+y))%2! =0)){ 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>=y&&xx>=yy)||(x==0)||(xx==0)&&x>=0&&y>=0&&xx>=0&&yy>=0&&(V.indexOf(x*10+y)==-1||(V.size()-V.indexOf(x*10+y))%2! =0)){ 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==-3){ xx=xx+2; x=x-2; yy=yy-2; y=y+2; if((x>=y&&xx>=yy)||(x==0)||(xx==0)&&x>=0&&y>=0&&xx>=0&&yy>=0&&(V.indexOf(x*10+y)==-1||(V.size()-V.indexOf(x*10+y))%2! =0)){ 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>=y&&xx>=yy)||(x==0)||(xx==0)&&x>=0&&y>=0&&xx>=0&&yy>=0&&(V.indexOf(x*10+y)==-1||(V.size()-V.indexOf(x*10+y))%2! =0)){ 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==-4){ yy=yy+2; y=y-2; yy=yy-1; xx=xx-1; y=y+1; x=x+1; if((x>=y&&xx>=yy)||(x==0)||(xx==0)&&x>=0&&y>=0&&xx>=0&&yy>=0&&(V.indexOf(x*10+y)==-1||(V.size()-V.indexOf(x*10+y))%2! =0)){ 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; } } 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; } } else{//过河成功,返回方案的设定 xx=xx-1; x=x+1; if((x>=y&&xx>=yy)||(x==0)||(xx==0)&&x>=0&&y>=0&&xx>=0&&yy>=0&&(V.indexOf(x*10+y)==-1||(V.size()-V.indexOf(x*10+y))%2! =0)){ V.add(x*10+y); s.push(newdk(1,0,-1)); } else{ xx=xx+1; x=x-1; yy=yy-1; y=y+1; if((x>=y&&xx>=yy)||(x==0)||(xx==0)&&x>=0&&y>=0&&xx>=0&&yy>=0&&(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>=y&&xx>=yy)||(x==0)||(xx==0)&&x>=0&&y>=0&&xx>=0&&yy>=0&&(V.indexOf(x*10+y)==-1||(V.size()-V.indexOf(x*10+y))%2! =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>=y&&xx>=yy)||(x==0)||(xx==0)&&x>=0&&y>=0&&xx>=0&&yy>=0&&(V.indexOf(x*10+y)==-1||(V.size()-V.indexOf(x*10+y))%2! =0)){ 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>=y&&xx>=yy)||(x==0)||(xx==0)&&x>=0&&y>=0&&xx>=0&&yy>=0&&(V.indexOf(x*10+y)==-1||(V.size()-V.indexOf(x*10+y))%2! =0)){ 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; } } } } } } } ff=true; inf=0;//此次轮渡成功的标志 //过河方案的设定 x=x-1; y=y-1; xx=xx+1; yy=yy+1; if(((x>=y&&xx>=yy)||(x==0)||(xx==0))&&xuan<1&&x>=0&&y>=0&&xx>=0&&yy>=0&&(V.indexOf(x*10+y)==-1||(V.size()-V.indexOf(x*10+y))%2! =0)){ V.add(x*10+y); s.push(newdk(1,1,1)); inf=1; } else{ x=x+
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 商人 过河 问题 java 程序 数学模型 1617 解答 董安葳