深搜法:模拟地铁路线算出两个站点之间的距离和所有通过的可能

来源:互联网 发布:mysql 删除表恢复 编辑:程序博客网 时间:2024/04/28 21:42
#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;






}
1 0
原创粉丝点击