function foot=chouxiang

%%%%%%%%%%%%%%%%%%%%%% 程序開始需要知道商人數,仆人數,船的最大容量
n=input('輸入商人數目:');
nn=input('輸入仆人數目:');
nnn=input('輸入船的最大容量:');
if nn>n
n=input('輸入商人數目:');
nn=input('輸入仆人數目:');
nnn=input('輸入船的最大容量:');
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 決策生成
jc=1; % 決策向量存放在矩陣“d”中,jc為插入新元素的行標初始為1
for i=0:nnn
for j=0:nnn

if (i+j<=nnn)&(i+j>0) % 滿足條件 D=
{(u,v)|1<=u+v<=nnn,u,v=0,1,2}
d(jc,1:3)=[i,j 1]; %生成一個決策向量后立刻將他擴充為三維(再末尾加“1”)
d(jc+1,1:3)=[-i,-j,-1]; % 同時生成他的負向量
jc=jc+2; % 由于一氣生成兩個決策向量,jc指標需要往下移動兩個單位
end
end
j=0;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 狀態數組生成

kx=1; % 狀態數組存放在矩陣“A”中,生成方法同決策生成
for i=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);
if v(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
foot='can not reach';
return;
end

foot(1)=y;
g=2; h=y;
while(1)
if h==x
break;
end
foot(g)=lmd(h);
g=g+1;
h=lmd(h);
end
foot=A(foot,:);
foot(:,3)=[];


這個代碼比我上回寫的C++代碼短很多。。。。。。看來還是Matlab強大丫 一定要盡快學會才行 :-)