[此贴子已经被作者于2005-9-12 15:42:37编辑过]
首先,我要向斑主说声对不起,因为我的疏忽,把原本小的b写成大写的B了,我测试的时候是用小写的测试的,提示*号语法错误, 我按照斑竹给的程序测试了一下.错误共有4处,都怪我给的是错误的程序了,还请斑竹帮忙给看一下把 下面是测试时的程序,绝对没错一个字母,还是老问题,仍然提示:说明语法错误 #include"stdio.h" #define MAX_LEN 10000 #define n 6 int len; //当前走过的犁镜的权值和 int min;//当前找到的最短路径的和 int k;//当前最短的步数 int c[n];//最短路 //递归子过程,从X到Y,总步数为Z void fd(int*gr,int x,int y,int z,int*a,bool*b) //这句里bool*b中间的*号被提示错误.错误提示是说:说明语法错误.而且只有*号变成兰色,bool和b都好好的,在*号的下面有一道蓝线提示*号错误,请大家指点这个*号到底错在啥地方了\如何修改呢这个语句,这个程序里就这一个错误了,还请大家指点.这是个求最短路径的小程序,我找了半个月才找见的.谢谢 { int f,j; for(f=0;f<n;f++){ //让F从0到N-1寻找邻结点 if(gr[x*n+f]>0&&b[f]==false){ //判断是否F点在X邻域并且F点没有走过 a[z]=f; //走到F点(F点进栈) b[f]=true; //记录F点已经走过 len=len+gr[x*n+f]; //在当前路径长度中增加新边长 if(f!=y) //如果没有走道Y点就继续走 fd(gr,f,y,z+1,a,b); else if(len<min){//走到Y就看当前长度是否比当前最小长度小,如果当前小就更新 k=z;//先记录下当前犁镜的点数 min=len;//以当前长度作为当前最小长度 for(j=1;j<k+1;j++)//依次更换当前最短路径中的每个点 c[j]=a[j]; }//结束更新 len=len-gr[x*n+f];//退掉F点,先在当前路径长度中减去退出的一条边长 b[f]=false;//把F点恢复为没有走过 }//结束X邻域的搜索 } } //在N个点的网上求X到Y的最短路径,关联距阵是GR
void shortest(int*gr,int x,int y,int*a,bool*b) { int i; min=MAX_LEN; for(i=0;i<n;i++) b[i]=false; a[0]=x; b[x]=true; len=0; fd(gr,x,y,1,a,b); for(i=0;i<k+1;i++) printf("%d,",c[i]); printf("\n"); printf("the shortest length is %d.\n",min); } void main() { int gr[n][n]={{0,1,2,0,0,0}, {1,0,1,3,1,0}, {2,1,0,0,0,12}, {0,3,0,0,1,0}, {0,1,0,1,0,8}, {0,0,12,0,8,0}}; int a[n]; bool b[n]; shortest((int*)gr,0,5,a,b); }
[此贴子已经被作者于2005-9-12 15:44:17编辑过]