深搜法:模拟地铁路线算出两个站点之间的距离和所有通过的可能
来源:互联网 发布: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;
}
#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
- 深搜法:模拟地铁路线算出两个站点之间的距离和所有通过的可能
- 通过经纬度计算两个之间的距离
- java实现floyd统计天津地铁的站点距离
- java 打印出两个IP之间的所有IP值
- 练习1.11:打印出两个整数之间的所有数
- 通过经纬度坐标计算两个点之间的距离
- iOS通过经纬度计算两个坐标之间的距离
- 通过两个经纬度获取他们之间的距离
- iOS通过经纬度计算两个地点之间的距离
- 通过SQL语句来造出两个日期之间的所有月份
- 打印出所有可能的括号组合
- 序列所有可能的出栈顺序
- 通过经度和纬度算出距离
- 已知元素从小到大排列的两个数组x[]和y[],请写出一个程序算出两个数组彼此之间差的绝对值中最小的一个,这叫做数组的距离
- iOS-计算两个经纬度之间的距离和方位
- python实现两个经纬度点之间的距离和方位角
- java获得两个日期之间的所有月份和所有
- 图中两个点之间的路线
- svn报错:“Previous operation has not finished; run 'cleanup' if it was interrupted“ 的解决方法
- 垃圾回收算法与收集器
- 针对一些简单排序的源码
- 欢迎使用CSDN-markdown编辑器
- Linux下的 task_struct内容
- 深搜法:模拟地铁路线算出两个站点之间的距离和所有通过的可能
- Path在android的使用
- 筛选号码
- matlab实现图像滤波——高斯滤波
- 【信源编码作业】3. 散列表/哈希表的介绍与理解
- SVN working copy 'XXX' locked
- 网易
- caffe-特征提取
- Doxygen Special Commands