这是2007年数模B题:乘公交看奥运的第一题程序,利用图论思想和扩散路由算法编的程序,但matlab运行结果有错
总是:??? Function 'eq' is not defined for values of class 'cell'.
Error in ==> eq at 18
[varargout{1:nargout}] = builtin('eq', varargin{:});
Error in ==> vv at 62
[row2 col2]=find(d==Fj(k,2));
源程序代码如下:求高人指点
function vv(start,aim)
%d=importdata('d:\matlab.mat');
[fee d]=data();
if numel(find(d==start))==0
fprintf('The path cannot be found!');
else
[row col]=find(d==start);
for i=1:numel(row)
[rows cols(i,1:2)]=find(d(row(i),: )==start);
end
F=creatF(start,row,cols,d);
end
if ismember(aim,F( :,2))
num=find(F(:,2)==aim);
line=round(F(num,3)-0.5);
long=F(num,1)-1;
time=3*F(num,1);
value=val(0,F(num,: ),fee);
updown=ud(F(num,3));
n={start,updown,line,aim,long,time,value};
print(n);
else
size_F=size(F);
cha=1;
Fc={};
n={};
for i=1:size_F(1)
[row1 col1]=find(d==F(i,2));
[rows cols]=find(d==start);
row1=setdiff(row1,rows);
if numel(row1)>0
for j=1:numel(row1)
col1(j,1:2)=find(d(row1(j),: )==F(i,2));
end
F1=creatF(F(i,2),row1,col1,d);
Fc={Fc F1};
if ismember(aim,F1( :,2))
num1=find(F1( :,2)==aim);
line1=round(F(i,3)-0.5);
mid1=F(i,2);
long1=F(i,1)-1;
line2=round(F1(num1,3)-0.5);
long2=F1(num1,1)-1;
time=3*(F(i,1)+F1(num1,1))+5;
value=val(0,F(i,: ),fee);
value=val(value,F1(num1,: ),fee);
updown1=ud(F(i,3));
updown2=ud(F1(num1,3));
n(cha,: )={start,updown1,line1,mid1,long1,updown2,line2,aim,long2,time,value};
cha=cha+1;
end
end
end
if cha==1
fprintf('The path with once chang cannot be found!\n');
sizec=size(Fc);
kind=1;
for j=1:sizec(2)
siz=size(Fc{j});
Fj=Fc{j};
for k=1:siz(1)
[row2 col2]=find(d==Fj(k,2));
[rows cols]=find(d==Fj(1,2));
[row col]=find(d==start);
row2=setdiff(row2,rows);
row2=setdiff(row2,row);
if numel(row2)>0
for l=1:numel(row2)
col2(l,1:2)=find(d(row2(l),: )==Fj(k,2));
end
F2=creatF(Fj(k,2),row2,col2,d);
if ismember(aim,F2( :,2))
num2=find(F2( :,2)==aim);
num1=find(Fj( :,2)==F2(1,2));
num=find(F( :,2)==Fj(1,2));
line1=round(F(num,3)-0.5);
line2=round(Fj(num1,3)-0.5);
line3=round(F2(num2,3)-0.5);
mid1=F(num,2);
mid2=Fj(num1,2);
long1=F(num,1)-1;
long2=Fj(num1,1)-1;
long3=F2(num2,1)-1;
time=3*(long1+long2+long3+3)+10;
value=val(0,F(num,: ),fee);
value=val(value,Fj(num1,: ),fee);
value=val(value,F2(num2,: ),fee);
updown1=ud(F(num,3));
updown2=ud(Fj(num1,3));
updown3=ud(F2(num2,3));
n(kind,: )={start,updown1,line1,mid1,long1,updown2,line2,mid2,long2,updown3,line3,aim,long3,time,value};
kind=kind+1;
end
end
end
end
if kind==1
fprintf('The path with twice change cannot be found!\n');;
else
minn=n{1,14};
for i=1:kind-1
if n{i,14}<minn
minn=n{i,14};
end
end
for i=1:kind-1
if n{i,14}==minn
print(n(i,: ));
end
end
end
else
minn=n{1,10};
for i=1:cha-1
if n{i,10}<minn
minn=n{i,10};
end
end
for i=1:cha-1
if n{i,10}==minn
print(n(i,: ));
end
end
end
end
return
function F=creatF(start,rows,cols,d)
%d=importdata('d:\我的文档\桌面\matlab.mat');
F=[0 start 0];
n=numel(rows);
for j=1:n
maxcol=numel(nonzeros(d(rows(j),: )));
if cols(j,1)~=cols(j,2)
for i=cols(j,1)+1:cols(j,2)-1
x=[i-cols(j,1) d(rows(j),i) rows(j)/2+0.5];
F=[F;x];
end
for i=1:cols(j,1)-1
x=[maxcol-cols(j,2)+i d(rows(j),i) rows(j)/2+0.5];
F=[F;x];
end
for i=cols(j,2)+1:maxcol
x=[i-cols(j,2) d(rows(j),i) rows(j)/2+0.5];
F=[F;x];
end
else
for k=cols(j)+1:maxcol
x=[k-cols(j) d(rows(j),k) rows(j)/2+0.5];
F=[F;x];
end
end
end
size_F=size(F);
f=unique(F( :,2));
size_f=size(f);
j=0;
re=0;
for i=1:size_F(1)
if ismember(F(i,2),f)
f(find(f==F(i,2)))=[];
else
if ~ismember(F(i,2),re)
j=j+1;
re(j)=F(i,2);
end
end
end
others=[];
for k=1:j
[row col]=find(F( :,2)==re(k));
[minre,where]=min(F(row,1));
where=row(where);
other=setdiff(row',where);
others=[others other];
end
F(others,: )=[];
return
function value=val(vl,F,fee)
%fee=importdata('d:\我的文档\桌面\fee.mat');
if strcmp(fee{round(F(3)-0.5)},'单一票制1元。')|F(1)<=20
value=vl+1;
else
if F(1)>20&F(1)<=40
value=vl+2;
else
value=vl+3;
end
end
return
function updown=ud(F)
if round(F)==F
updown='上';
else
updown='下';
end
return
function print(n)
if numel(n)==7
fprintf('您可以从%d站乘坐%s行%d路公汽直到%d站,中途经过%d个车站,乘车时间%d分钟,将花费%d元,祝您乘车愉快!',n{1},n{2},n{3},n{4},n{5},n{6},n{7});
end
if numel(n)==11
fprintf('您可以从%d站乘坐%s行%d路公汽到%d站,中途经过%d个车站,从此站转乘%s行%d路公汽直到%d站,中途经过%d个车站,乘车时间%d分钟,将花费%d元,祝您乘车愉快!\n',n{1},n{2},n{3},n{4},n{5},n{6},n{7},n{8},n{9},n{10},n{11});
end
if numel(n)==15
fprintf('您可以从%d站乘%s行%d路到%d站,途经%d个车站,转乘%s行%d路到%d站,途经%d个车站,再转乘%s行%d路直到%d站,途经%d个车站,乘车时间%d分钟,将花费%d元,祝您乘车愉快!\n',n{1},n{2},n{3},n{4},n{5},n{6},n{7},n{8},n{9},n{10},n{11},n{12},n{13},n{14},n{15});
end
return
function [fee,d]=data()
data=importdata('d:\data.mat');
i=1;
while ~strcmp(data{i},'END')
for j=1:4
ls{(i+3)/4,j}=data{i-1+j};
end
i=i+4;
end
fee=ls(:,2);
siz=size(ls);
for i=1:siz(1)
a=ls{i,3};
b='0';
for j=1:numel(a)
if ~strcmp(a(j),'S')&~strcmp(a(j),'-')&~strcmp(a(j),'上')&~strcmp(a(j),'行')&~strcmp(a(j),':')&~strcmp(a(j),'环')
b=strcat(b,a(j));
end
end
b=b(2:numel(b));
for k=1:numel(b)/4
c(i,k)=str2num(b(4*(k-1)+1:4*k));
end
end
for i=1:siz(1)
a=ls{i,3};
a1=ls{i,4};
b1='';
if strcmp(a1,'')&strcmp(a(1),'环')
c1(i,1)=0;
end
if strcmp(a1,'')&strcmp(a(1),'S')
for j=1:numel(a)
if ~strcmp(a(j),'S')&~strcmp(a(j),'-')
b1=strcat(b1,a(j));
end
end
l=1;
for k=numel(b1)/4:-1:1
c1(i,l)=str2num(b1(4*(k-1)+1:4*k));
l=l+1;
end
end
b1='';
if ~strcmp(a1,'')
for j=1:numel(a1)
if ~strcmp(a1(j),'S')&~strcmp(a1(j),'-')&~strcmp(a1(j),'下')&~strcmp(a1(j),'行')&~strcmp(a1(j),':')
b1=strcat(b1,a1(j));
end
end
for k=1:numel(b1)/4
c1(i,k)=str2num(b1(4*(k-1)+1:4*k));
end
end
end
j=1;
for i=1:siz(1)
d(j,1:numel(c(i,: )))=c(i,: );
d(j+1,1:numel(c1(i,: )))=c1(i,: );
bh(j,1)=i;
j=j+2;
end
return