目的:从如下所示的图中,用程序找出从A到D所花时间
#define
NODENUM 6
#define STARTNODE 0
#define TRAGETNODE 3
char g_aNodes[NODENUM] = ... {'A','B','C','D','E','F'} ;
int g_aDist[NODENUM][NODENUM] = ... {
...{0,7,0,0,0,6},
...{7,0,7,0,0,6},
...{0,7,0,3,3,9},
...{0,0,3,0,4,0},
...{0,0,3,4,0,8},
...{6,6,9,0,8,0}} ;
float g_aBroken[NODENUM][NODENUM] = ... {
...{0,0.7,0,0,0,0},
...{0.7,0,0,0,0,0},
...{0,0,0,0,0,0},
...{0,0,0,0,0,0},
...{0,0,0,0,0,0.6},
...{0,0,0,0,0.6,0}} ;
int g_iPath[NODENUM + 1 ];
int searchPath( const int aDistMatrix[NODENUM][NODENUM], int aPathStack[NODENUM + 1 ], const int iPathDist, const float fPassed, const int iCurrNode, int iStackPoint) ... {
int i=0,j=0,r=0;
for(i=0;i<iStackPoint;i++)...{
if(iCurrNode==aPathStack[i])
...{return 0;}
//return 0 if current node had passed
}
aPathStack[iStackPoint++]=iCurrNode;
//push current node into path stack
for(i=0;i<NODENUM;i++)...{
if(aDistMatrix[iCurrNode][i]>0)...{
if(TRAGETNODE==i)...{
//find a path to target
printf("%3d:%1.2f:",iPathDist+aDistMatrix[iCurrNode][i],fPassed*(1-g_aBroken[iCurrNode][i]));
for(j=0;j<iStackPoint;j++)
...{printf("%c->",g_aNodes[aPathStack[j]]);}
printf("%c ",g_aNodes[TRAGETNODE]);
r++;
}
else
...{//find a continue
r+=searchPath(aDistMatrix,aPathStack,iPathDist+aDistMatrix[iCurrNode][i],fPassed*(1-g_aBroken[iCurrNode][i]),i,iStackPoint);
}
}
}
return r;
}
int main( int argc, char * argv[]) ... {
int iPN=0;
printf("----------------------------------------------------- ");
iPN=searchPath(g_aDist,g_iPath,0,1,0,0);
printf("----------------------------------------------------- Found Paths:%d",iPN);
return 0;
}
#define STARTNODE 0
#define TRAGETNODE 3
char g_aNodes[NODENUM] = ... {'A','B','C','D','E','F'} ;
int g_aDist[NODENUM][NODENUM] = ... {
...{0,7,0,0,0,6},
...{7,0,7,0,0,6},
...{0,7,0,3,3,9},
...{0,0,3,0,4,0},
...{0,0,3,4,0,8},
...{6,6,9,0,8,0}} ;
float g_aBroken[NODENUM][NODENUM] = ... {
...{0,0.7,0,0,0,0},
...{0.7,0,0,0,0,0},
...{0,0,0,0,0,0},
...{0,0,0,0,0,0},
...{0,0,0,0,0,0.6},
...{0,0,0,0,0.6,0}} ;
int g_iPath[NODENUM + 1 ];
int searchPath( const int aDistMatrix[NODENUM][NODENUM], int aPathStack[NODENUM + 1 ], const int iPathDist, const float fPassed, const int iCurrNode, int iStackPoint) ... {
int i=0,j=0,r=0;
for(i=0;i<iStackPoint;i++)...{
if(iCurrNode==aPathStack[i])
...{return 0;}
//return 0 if current node had passed
}
aPathStack[iStackPoint++]=iCurrNode;
//push current node into path stack
for(i=0;i<NODENUM;i++)...{
if(aDistMatrix[iCurrNode][i]>0)...{
if(TRAGETNODE==i)...{
//find a path to target
printf("%3d:%1.2f:",iPathDist+aDistMatrix[iCurrNode][i],fPassed*(1-g_aBroken[iCurrNode][i]));
for(j=0;j<iStackPoint;j++)
...{printf("%c->",g_aNodes[aPathStack[j]]);}
printf("%c ",g_aNodes[TRAGETNODE]);
r++;
}
else
...{//find a continue
r+=searchPath(aDistMatrix,aPathStack,iPathDist+aDistMatrix[iCurrNode][i],fPassed*(1-g_aBroken[iCurrNode][i]),i,iStackPoint);
}
}
}
return r;
}
int main( int argc, char * argv[]) ... {
int iPN=0;
printf("----------------------------------------------------- ");
iPN=searchPath(g_aDist,g_iPath,0,1,0,0);
printf("----------------------------------------------------- Found Paths:%d",iPN);
return 0;
}
程序运行输出结果图