商人过河问题matlab程序function jueche=guohe
%%%%%%%%%%%%%%%%%%%%%%
程序开始需要知道商人和仆人数java商人过河代码;
n=input('输入商人数目: ');
nn=input('输入仆人数目: ');
nnn=input('输入船java商人过河代码的最大容量: ');
if nnn
n=input(''输入商人数目:');
nn=input('输入仆人数目:');
nnn=input('输入船的最大容量:');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%决策生成
jc=1;%决策向量放在矩阵d中java商人过河代码,jc为插入新元素的行标初始为1;
for i=0:nnn
for j=0:nnn
if (i j=nnn)(i j0)% 满足条D={(u,v)|1=u v=nnn,u,v=0,1,2}
d(jc,1:3)=[i,jjava商人过河代码,1];%生成一个决策向量立刻扩充为三维;
d(jc 1,1:3)=[-i,-j,-1];%同时生成java商人过河代码他的负向量;
jc=jc 2;%由于生成两个决策向量,则jc要向下移动两个;end
end
j=0;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%状态数组生成
kx=1;% 状态向量放在A矩阵中,生成方法同矩阵生成;
fori=n:-1:0
for j=nn:-1:0
if((i=j)((n-i)=(nn-j)))|((i==0)|(i==n))
%(i=j)((n-i)=(nn-j)))|((i==0)|(i==n))为可以存在的状态的约束条件
A(kx,1:3)=[i,j,1];%生成状态数组集合D `
A(kx 1,1:3)=[i,j,0];
kx=kx 2;
end
end
j=nn;
end;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%将状态向量生成抽象矩阵
k=(1/2)*size(A,1);
CX=zeros(2*k,2*k);
a=size(d,1);
for i=1:2*k
for j=1:a
c=A(i,:) d(j,:) ;
x=find((A(:,1)==c(1))(A(:,2)==c(2))(A(:,3)==c(3))) ;
v(i,x)=1;%x为空不会改变v值
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% dijstra算法
x=1; y=size(A,1);
m=size(v,1);
T=zeros(m,1);
T=T.^-1;
lmd=T;
P=T;
S=zeros(m,1);
S(x)=1;
P(x)=0; lmd(x)=0;
k=x;
while(1)
a=find(S==0);
aa=find(S==1);
if size(aa,1)==m
break;
end
for j=1:size(a,1)
pp=a(j,1);
ifv(k,pp)~=0
if T(pp)(P(k) v(k,pp))
T(pp)=(P(k) v(k,pp));
lmd(pp)=k;
end
end
end
mi=min(T(a));
if mi==inf
break;
else
d=find(T==mi);
d=d(1);
P(d)=mi;
T(d)=inf;
k=d;
S(d)=1;
end
end
if lmd(y)==inf
jueche='can not reach';
return;
end
jueche(1)=y;
g=2; h=y;
while(1)
if h==x
break;
end
jueche(g)=lmd(h);
g=g 1;
h=lmd(h);
end
jueche=A(jueche,:);
jueche(:,3)=[];
三个强盗三个商人过河 简单的入门级别算法3个商人和3个强盗要过一条河,如果在河的任意一边商人数目比强盗少,商人就会被抢劫,如何过河?
河边有一只小船,小船上原本无人,小船最多能坐2人,他们都不会去游泳,要保证商人不会被抢劫 。
先简化一下商人和强盗:
商人为0强盗为X河为-
初始情况:商人和强盗都在河的一边,即000xxx-
操作步骤:
1商人1强盗过去 一商人回000xx-x
2强盗过去 1强盗回 000x-xx
2商人过去 1商人1强盗回 00xx-x0
2商人过去 1强盗回 xxx-000
2强盗过去 1强盗回 xx-000x
2强盗过去 完毕 -xxx000
如何用Java编写三个线程实现狼羊白菜过河问题开三个线程 , 一个代表狼,一个代表羊 , 一个代表白菜 。
一艘船 。两个位置 。
河有两边,
狼跟羊互斥 , 羊跟白菜互斥 。
即他们不能在船不在此岸边的时候同时存在 。
狼,羊 , 白菜的线程去抢船的位置 。(船在此岸)(2个位置,去抢吧,抢到了就占个座 。。。。)
再开一个线程 。。。。OYE~
船判断能不能离岸,不能离就泄空 。能就到对岸就把这两个位置上的泄到对岸,船也到对岸 。
然后狼,羊,白菜的线程继续去抢船的位置 。
船线程继续判能不能离岸 。(船上的位置剩余0或1或2时只要2岸不出现互斥,都可以离岸)
能就走,不能就泄空 。。。。
如此往复
直到有一天 。。。3个都到对岸了 。。OK了 。。。
谁会要求写出这样没有逻辑的纯靠运气的程序啊 。。。
现在的学校真操蛋 。。。。
用java实现野人传教士过河问题//CrossRiverQuestion.java
import java.util.ArrayList;
import java.util.List;
public class CrossRiverQuestion {
public static void main(String[] args) {
CrossRiverQuestion q = new CrossRiverQuestion(5, 4);
q.solveQuestion();
}
private int peoNum;
private int savageNum;
private ListNode resultList = new ArrayListNode();
public ListNode solveQuestion() {
Node n = new Node(peoNum,savageNum,0,0,0,new ArrayListInteger(),0,0);
boolean dfsResult = dfs(n);
if(dfsResult) {
resultList.add(0,n);
for(Node node : resultList) {
System.out.println("左岸传教士:" node.getLeftPeo() "左岸野人: " node.getLeftSavage() " 右岸传教士: " node.getRightPeo() "右岸野人:" node.getRightSavage() "船上传教士:" node.getOnBoatPeoNum() "船上野人:" node.getOnBoatSavageNum());
}
return resultList;
}
return null;
}
public CrossRiverQuestion(int peoNum, int savageNum) {
super();
this.peoNum = peoNum;
this.savageNum = savageNum;
}
private boolean dfs(Node n) {
if(n.hasVisited()) return false;
n.addCheckSum();
if(n.getLeftPeo()==0n.getLeftSavage()==0) return true;
if(n.getLeftPeo()0||n.getRightPeo()0||n.getLeftSavage()0||n.getRightSavage()0) {
return false;
}
if(n.getLeftPeo()n.getLeftSavage()n.getLeftPeo()0) return false;
if(n.getRightPeo()n.getRightSavage()n.getRightPeo()0) return false;
if(n.getCURR_STATE()==n.getStateBoatLeft()) {
Node n1 = new Node(n.getLeftPeo()-1,n.getLeftSavage()-1,n.getRightPeo() 1,n.getRightSavage() 1,n.getStateBoatRight(),n.getNodesCheckSum(),1,1);
if(dfs(n1)) {
resultList.add(0,n1);
return true;
}
Node n4 = new Node(n.getLeftPeo()-2,n.getLeftSavage(),n.getRightPeo() 2,n.getRightSavage(),n.getStateBoatRight(),n.getNodesCheckSum(),2,0);
if(dfs(n4)) {
resultList.add(0,n4);
return true;
}
Node n5 = new Node(n.getLeftPeo(),n.getLeftSavage()-2,n.getRightPeo(),n.getRightSavage() 2,n.getStateBoatRight(),n.getNodesCheckSum(),0,2);
if(dfs(n5)){
resultList.add(0,n5);
return true;
}
}
else {
Node n6 = new Node(n.getLeftPeo(),n.getLeftSavage() 1,n.getRightPeo(),n.getRightSavage()-1,n.getStateBoatLeft(),n.getNodesCheckSum(),0,1);
if(dfs(n6)) {
resultList.add(0,n6);
return true;
}
Node n7 = new Node(n.getLeftPeo() 1,n.getLeftSavage(),n.getRightPeo()-1,n.getRightSavage(),n.getStateBoatLeft(),n.getNodesCheckSum(),1,0);
if(dfs(n7)) {
【java商人过河代码 商人过河问题matlab程序】resultList.add(0,n7);
return true;
}
Node n1 = new Node(n.getLeftPeo() 1,n.getLeftSavage() 1,n.getRightPeo()-1,n.getRightSavage()-1,n.getStateBoatLeft(),n.getNodesCheckSum(),1,1);
if(dfs(n1)) {
resultList.add(0,n1);
return true;
}
Node n4 = new Node(n.getLeftPeo() 2,n.getLeftSavage(),n.getRightPeo()-2,n.getRightSavage(),n.getStateBoatLeft(),n.getNodesCheckSum(),2,0);
if(dfs(n4)) {
resultList.add(0,n4);
return true;
}
Node n5 = new Node(n.getLeftPeo(),n.getLeftSavage() 2,n.getRightPeo(),n.getRightSavage()-2,n.getStateBoatLeft(),n.getNodesCheckSum(),0,2);
if(dfs(n5)){
resultList.add(0,n5);
return true;
}
}
return false;
}
public ListNode getResultList() {
return resultList;
}
}
Node.java
import java.util.ArrayList;
import java.util.List;
public class Node {
private ListInteger nodesCheckSum = new ArrayListInteger();
private int leftPeo;
private int rightPeo;
private int leftSavage;
private int rightSavage;
private int CURR_STATE = 0;
private int onBoatPeoNum = 0;
private int onBoatSavageNum = 0;
private final int STATE_BOAT_LEFT = 0;
private final int STATE_BOAT_RIGHT = 1;
public Node(int leftPeo, int leftSavage, int rightPeo, int rightSavage, int state, List checkSumList, int onBoatPeoNum, int onBoatSavageNum) {
this.CURR_STATE = state;
this.leftPeo = leftPeo;
this.leftSavage = leftSavage;
this.rightPeo = rightPeo;
this.rightSavage = rightSavage;
this.nodesCheckSum.addAll(checkSumList);
this.onBoatPeoNum = onBoatPeoNum;
this.onBoatSavageNum = onBoatSavageNum;
}
public int getLeftPeo() {
return leftPeo;
}
public void setLeftPeo(int leftPeo) {
this.leftPeo = leftPeo;
}
public int getRightPeo() {
return rightPeo;
}
public void setRightPeo(int rightPeo) {
this.rightPeo = rightPeo;
}
public int getLeftSavage() {
return leftSavage;
}
public void setLeftSavage(int leftSavage) {
this.leftSavage = leftSavage;
}
public int getRightSavage() {
return rightSavage;
}
public void setRightSavage(int rightSavage) {
this.rightSavage = rightSavage;
}
@Override
public String toString() {
return leftPeo "," leftSavage "," rightPeo "," rightSavage "," CURR_STATE;
}
public int getCURR_STATE() {
return CURR_STATE;
}
public void setCURR_STATE(int cURR_STATE) {
CURR_STATE = cURR_STATE;
}
public int getStateBoatLeft() {
return STATE_BOAT_LEFT;
}
public int getStateBoatRight() {
return STATE_BOAT_RIGHT;
}
public int calcCheckSum() {
return 1*getCURR_STATE() 10*getLeftPeo() 100*getLeftSavage() 1000*getRightPeo() 10000*getRightSavage();
}
public void addCheckSum() {
int checkSum = calcCheckSum();
nodesCheckSum.add(checkSum);
}
public boolean hasVisited() {
int sum = calcCheckSum();
for (Integer checkSum : nodesCheckSum) {
if(checkSum==sum) return true;
}
return false;
}
public ListInteger getNodesCheckSum() {
return nodesCheckSum;
}
public int getOnBoatPeoNum() {
return onBoatPeoNum;
}
public void setOnBoatPeoNum(int onBoatPeoNum) {
this.onBoatPeoNum = onBoatPeoNum;
}
public int getOnBoatSavageNum() {
return onBoatSavageNum;
}
public void setOnBoatSavageNum(int onBoatSavageNum) {
this.onBoatSavageNum = onBoatSavageNum;
}
}
四个主人四个仆人如何渡河数学建模代码用QT写的商人过河的代码 。
渡河问题我是做的不少了,不过经我分析.类似的渡河题目应是四个商人 四个随从有法可解,因为1船2个人,情况都被定死的 。
2随从去 , 2随从回,2商人去,1随从 1商人回,2商人去,2随从回 , 2随从去,1随从回,2随从去,渡河成功 。
关于java商人过河代码和商人过河问题matlab程序的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 钉钉pdf怎么分享,钉钉pdf怎么转发
- 如何管理营销团队,如何管理营销团队的方法
- html5重新打开一个新窗口,html打开新网页
- 如何推广自己的药品卖,如何去药店推广药品
- java升级菜单切换代码 java升级菜单切换代码怎么写
- sqlserver组合主键设置,sql 组合主键
- 格斗游戏背后的美术课程,格斗教学游戏
- 钉钉直播无法连接设备,钉钉直播为什么连不上麦
- go语言哪个版本好 go语言哪个版本好一点