#include "stdio.h" #include "stdlib.h" #define N 8 unsigned int City[N][N]=//地图 { {0,10,15,0,0,0,0,0}, {10,0,0,0,0,30,0,0}, {15,0,0,10,20,0,20,0}, {0,0,10,0,0,30,0,0}, {0,0,20,0,0,10,0,0}, {0,30,0,30,10,0,0,10}, {0,0,20,0,0,0,0,15}, {0,0,0,0,0,10,15,0} }; int ver[N]; //堆栈操作,没有做特殊处理 class stack { private: int data[100]; int root[10][10]; int sp;//堆栈指针 int rootsp; public: void push(int); int pop(); void show(); void save(); void getmin(); stack(){for (int i=0;i<100;i++)data[i]=0;sp=0;rootsp=0;for (i=0;i<10;i++)for (int j=0;j<10;j++)root[i][j]=-1;} }; //找出最短的一条 void stack::getmin() { int sum=0; int minflag=0; int mins=9999; int j=1; for (int i=0;i<rootsp;i++) { while(root[i][j]!=-1){sum+=City[root[i][j-1]][root[i][j]];j++;} if (sum<mins) {mins=sum;minflag=i;} j=1; sum=0; } j=0; printf("最短路径为: "); while(root[minflag][j]!=-1){printf("%c ",root[minflag][j]+'A');j++;} } //将当前堆栈内容保存 void stack::save() { for (int i=0;i<sp;i++) { // root[rootsp][i]=City[data[i]][data[i+1]]; root[rootsp][i]=data[i]; } rootsp++; } void stack::show() { for (int i=0;i<sp;i++) printf("%c ",data[i]+'A'); printf("/n"); } void stack::push(int a) { data[sp]=a; sp++; } int stack::pop() { return data[--sp]; } /////定义堆栈 stack sp; //关键处的递归处理 int di(int x,int y)//从X到Y { ver[x]=1;//表示x被访问了 sp.push(x); for (int i=0;i<N;i++) { if (i==x) continue; if (x==y) {sp.show();sp.save();break;} if (City[x][i]!=0&&ver[i]==0)di(i,y); } ver[x]=0; sp.pop(); return 0; } int main() { di(0,2); sp.getmin(); return 0; } 结果: