#include<stdio.h>
#include<string.h>
int x,y,stack[15],m=1,sum=0;
int minstack[15],len,min=1234; //min可以为别的值,只要是方便下面最小值得判断,但该值得大
//两点之间导通路径矩阵,导通为1,不通为0
int path[14][14]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,0,0,0,0,0,1,
0,1,0,1,0,0,0,0,0,0,0,0,0,0,
0,0,1,0,1,0,1,0,0,0,0,0,0,0,
0,0,0,1,0,1,1,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,1,1,0,0,0,0,0,
0,0,0,1,1,0,0,1,0,1,0,0,0,0,
0,0,0,0,0,1,1,0,1,1,0,0,0,0,
0,0,0,0,0,1,0,1,0,0,1,1,0,0,
0,0,0,0,0,0,1,1,0,0,1,0,0,1,
0,0,0,0,0,0,0,0,1,1,0,0,1,0,
0,0,0,0,0,0,0,0,1,0,0,0,1,0,
0,0,0,0,0,0,0,0,0,0,1,1,0,1,
0,1,0,0,0,0,0,0,0,1,0,0,1,0
};
//两点之间距离矩阵
int path_len[14][14]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,5,0,0,0,0,0,0,0,0,0,0,26,
0,5,0,17,0,0,0,0,0,0,0,0,0,0,
0,0,17,0,15,20,0,0,0,0,0,0,0,0,
0,0,0,14,0,5,5,0,0,0,0,0,0,0,
0,0,0,0,5,0,0,5,11,0,0,0,0,0,
0,0,0,20,5,0,0,5,0,3,0,0,0,0,
0,0,0,0,0,5,5,0,12,5,0,0,0,0,
0,0,0,0,0,11,0,12,0,0,3,6,0,0,
0,0,0,0,0,0,3,5,0,0,12,0,0,12,
0,0,0,0,0,0,0,0,3,12,0,0,17,0,
0,0,0,0,0,0,0,0,6,0,0,0,14,0,
0,0,0,0,0,0,0,0,0,0,17,14,0,21,
0,26,0,0,0,0,0,0,0,12,0,0,21,0
};
void dfs(int p) //搜索函数 搜出与p相连的点
{
int i, j,flag,k;
for(i=1; i<=13; i++) //
{
if(path[p][i]==1) //判断p,i两点是否相连
{
if(i == y)///如果深搜到了终点,就输出刚才经过的路径
{
for(j=0; j<m; j++) //
{
if(j<(m-1))
{
len=len+path_len[stack[j]][stack[j+1]]; //计算路线的长度
}
printf("%-5d", stack[j]); //打印出路线,此处没有终点路径
}
sum++; //路线种数加1
printf("%-5d\n", y); //打印出终点路径
len=path_len[stack[j-1]][y]+len; //得到该路线的长度
printf("本条路线长度为:%d\n\n",len); //打印出该路线长度
if(len<min) //判断新的路线长度是否比当前最小路径小
{
min=len; //最小路线为当前路线
memset(minstack,0,sizeof(minstack)); //清零数组minstack
for(j=0;j<m;j++)
{
minstack[j]=stack[j];//把最小路线存在数组minstack
}
minstack[j]=y; //把终点存在数组minstack
}
len=0;
}
else///如果该点不是终点
{
for(k=0;k<m;k++)
{
if(i==stack[k]) //逐个判断点i是否已经存在了,防止重复
{
flag=0; //把标志位置0
break;
}
flag=1; //把标志位置1
}
if(flag==1)//如果标志位是1
{
stack[m] = i;///将该点存起来
m++;
dfs(i);///接着深搜
m--;
}
}
}
}
}
int main()
{
int j;
printf("***************************************************\n");
printf(" 欢迎来到深圳地铁路线查询系统\n");
printf("***************************************************\n\n");
printf("请输入起点站:");
scanf("%d",&x); //获取起点
printf("请输入终点站:");
scanf("%d",&y); //获取终点
printf("\n可以选择的路线如下:\n");
stack[0]=x; //记录起点
dfs(x);
printf("总共有 %d 条路线\n",sum);
printf("\n最小路线长度为:%d\n",min);
printf("该路线是: ");
j=0;
while(minstack[j])
{
printf("%-5d",minstack[j]); //打印出最小距离
j++;
}
printf("\n\n祝您旅途愉快\n");
while(1);
return 0;
}
#include<string.h>
int x,y,stack[15],m=1,sum=0;
int minstack[15],len,min=1234; //min可以为别的值,只要是方便下面最小值得判断,但该值得大
//两点之间导通路径矩阵,导通为1,不通为0
int path[14][14]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,0,0,0,0,0,1,
0,1,0,1,0,0,0,0,0,0,0,0,0,0,
0,0,1,0,1,0,1,0,0,0,0,0,0,0,
0,0,0,1,0,1,1,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,1,1,0,0,0,0,0,
0,0,0,1,1,0,0,1,0,1,0,0,0,0,
0,0,0,0,0,1,1,0,1,1,0,0,0,0,
0,0,0,0,0,1,0,1,0,0,1,1,0,0,
0,0,0,0,0,0,1,1,0,0,1,0,0,1,
0,0,0,0,0,0,0,0,1,1,0,0,1,0,
0,0,0,0,0,0,0,0,1,0,0,0,1,0,
0,0,0,0,0,0,0,0,0,0,1,1,0,1,
0,1,0,0,0,0,0,0,0,1,0,0,1,0
};
//两点之间距离矩阵
int path_len[14][14]={
0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,5,0,0,0,0,0,0,0,0,0,0,26,
0,5,0,17,0,0,0,0,0,0,0,0,0,0,
0,0,17,0,15,20,0,0,0,0,0,0,0,0,
0,0,0,14,0,5,5,0,0,0,0,0,0,0,
0,0,0,0,5,0,0,5,11,0,0,0,0,0,
0,0,0,20,5,0,0,5,0,3,0,0,0,0,
0,0,0,0,0,5,5,0,12,5,0,0,0,0,
0,0,0,0,0,11,0,12,0,0,3,6,0,0,
0,0,0,0,0,0,3,5,0,0,12,0,0,12,
0,0,0,0,0,0,0,0,3,12,0,0,17,0,
0,0,0,0,0,0,0,0,6,0,0,0,14,0,
0,0,0,0,0,0,0,0,0,0,17,14,0,21,
0,26,0,0,0,0,0,0,0,12,0,0,21,0
};
void dfs(int p) //搜索函数 搜出与p相连的点
{
int i, j,flag,k;
for(i=1; i<=13; i++) //
{
if(path[p][i]==1) //判断p,i两点是否相连
{
if(i == y)///如果深搜到了终点,就输出刚才经过的路径
{
for(j=0; j<m; j++) //
{
if(j<(m-1))
{
len=len+path_len[stack[j]][stack[j+1]]; //计算路线的长度
}
printf("%-5d", stack[j]); //打印出路线,此处没有终点路径
}
sum++; //路线种数加1
printf("%-5d\n", y); //打印出终点路径
len=path_len[stack[j-1]][y]+len; //得到该路线的长度
printf("本条路线长度为:%d\n\n",len); //打印出该路线长度
if(len<min) //判断新的路线长度是否比当前最小路径小
{
min=len; //最小路线为当前路线
memset(minstack,0,sizeof(minstack)); //清零数组minstack
for(j=0;j<m;j++)
{
minstack[j]=stack[j];//把最小路线存在数组minstack
}
minstack[j]=y; //把终点存在数组minstack
}
len=0;
}
else///如果该点不是终点
{
for(k=0;k<m;k++)
{
if(i==stack[k]) //逐个判断点i是否已经存在了,防止重复
{
flag=0; //把标志位置0
break;
}
flag=1; //把标志位置1
}
if(flag==1)//如果标志位是1
{
stack[m] = i;///将该点存起来
m++;
dfs(i);///接着深搜
m--;
}
}
}
}
}
int main()
{
int j;
printf("***************************************************\n");
printf(" 欢迎来到深圳地铁路线查询系统\n");
printf("***************************************************\n\n");
printf("请输入起点站:");
scanf("%d",&x); //获取起点
printf("请输入终点站:");
scanf("%d",&y); //获取终点
printf("\n可以选择的路线如下:\n");
stack[0]=x; //记录起点
dfs(x);
printf("总共有 %d 条路线\n",sum);
printf("\n最小路线长度为:%d\n",min);
printf("该路线是: ");
j=0;
while(minstack[j])
{
printf("%-5d",minstack[j]); //打印出最小距离
j++;
}
printf("\n\n祝您旅途愉快\n");
while(1);
return 0;
}