沙发
liangbch [专家分:1270] 发布于 2006-06-19 11:01:00
1。题目出得不好,“甲乙丙丁”是天干,而“未”的地支。混用他们,让人不知所以。顺便列出10天干和12地支。甲乙丙丁戊己庚辛壬癸, 子丑寅卯辰巳午未申酉戌亥。
2。下面给出我写的一个完整的代码。2维数组costarray定义了12个点中,任意两个点的距离,max表示这两个点是不相连的。MinCost是一个计算最短路径的函数,采用递归调用算法.第三个参数level表示递归调用到第几层,首次调用level=0,在函数中再次调用为level=1,这个参数的设置主要是为了记录路径用的,当这个函数计算完毕,一条从起点到终点的路径就存储到数组 minway 中,可以用printPath打印出路径.
3.递归调用对初学者来说,是个难点,需要较强的逻辑思维.这个程序可能令你可能难以理解.事实上,我最初看到的这道题来自一个硕士生的课堂作业.然后,我独立完成了这个程序(大约用了2-3个小时),如果你是一个初学者.看不懂这个程序不要泄气.
#include <stdio.h>
#include <time.h>
#define max 100
#define START_NODE 0
#define END_NODE 11
int costarray[12][12]=
{
// 0 1 2 3 4 5 6 7 8 9 10 11
{max, 9, 7, 3, 2, max,max,max,max,max,max,max}, //0
{max, max,max,max,max,4, 2, 1, max,max,max,max}, //1
{max, max,max,max,max,2, 7, max,max,max,max,max}, //2
{max, max,max,max,max,max,max,11, max,max,max,max}, //3
{max, max,max,max,max,max,11, 8, max,max,max,max}, //4
{max, max,max,max,max,max,max,max,6, 5, max,max}, //5
{max, max,max,max,max,max,max,max,4, 3, max,max}, //6
{max, max,max,max,max,max,max,max,max,5, 6, max}, //7
{max, max,max,max,max,max,max,max,max,max,max,4}, //8
{max, max,max,max,max,max,max,max,max,max,max,2}, //9
{max, max,max,max,max,max,max,max,max,max,max,5}, //10
{max, max,max,max,max,max,max,max,max,max,max,max} //11
};
int minway[12];
int cost=100*max;
void printPath()
{
int i;
for (i=0;true;i++)
{
printf( "%d",minway[i]);
if (minway[i]==END_NODE)
break;
else
printf("->");
}
printf("\n");
}
int MinCost(int i,int j,int level)
{
int min=10000*max;
int k,t;
minway[level]=i;
if (costarray[i][j]!=max)
{
min=costarray[i][j];
if (j==END_NODE)
minway[level+1]=j;
}
for(k=START_NODE;k<END_NODE;k++)
{
if (k==i || k==j || costarray[i][k] ==max)
continue;
t=costarray[i][k]+MinCost(k,j,level+1);
if (t<min)
{
min=t;
if (i==START_NODE)
printPath();
}
}
return min;
}
void main()
{
int cost=MinCost(START_NODE,END_NODE,0);
printf("min cost=%d\n",cost);
}