前文再续,书接上一题。话说当上小面的司机的Lele在施行他的那一套拉客法则以后,由于走的路线太长,油费又贵,不久便亏本了。(真可怜~)于是他又想了一个拉客的办法。
对于每一次拉客活动,他一次性把乘客都拉上车(当然也不会超过7个,因为位置只有7个)。然后,Lele计算出一条路线(出于某些目的,Lele只把车上乘客的目的地作为这条路线上的站点),把所有乘客都送到目的地(在这路线上不拉上其他乘客),并且使总路线长度最短。
不过Lele每次都要花很多时间来想路线,你能写个程序帮他嘛?
Input本题目包含多组测试。最后一组测试后有一个0代表结束。
对于每一次拉客活动,他一次性把乘客都拉上车(当然也不会超过7个,因为位置只有7个)。然后,Lele计算出一条路线(出于某些目的,Lele只把车上乘客的目的地作为这条路线上的站点),把所有乘客都送到目的地(在这路线上不拉上其他乘客),并且使总路线长度最短。
不过Lele每次都要花很多时间来想路线,你能写个程序帮他嘛?
每组测试第一行有一个整数NCity(3<=NCity<=30)表示下沙一共有多少个站点(站点从0开始标号)。
然后给你一个 NCity * NCity 的矩阵,表示站点间的两两距离。即这个矩阵中第 i 行 第 j 列的元素表示站点 i 和站点 j 的距离。(0<=距离<=1000)
再然后有一个整数K(1<=K<=7),表示Lele拉上车的人数。
接下来的一行里包括 K 个整数,代表上车的人分别要去的站点。(0<站点<NCity)
注意:
对于每组测试,Lele都是在站点0拉上乘客的。Output对于每一组测试,在一行内输出一个整数,表示最短路线的长度。Sample Input
3 0 1 2 1 0 3 2 3 0 3 1 1 2 0Sample Output
4
题意:一辆能坐K个人车,送这K人去想去的地方. 有n个city点,并且车车每次都从0点开始出发;
分析:一个简单的深搜,要维处理一下;因为可能会有几个人在同一站下车,所以我们只要标记要去几个站点,而不是有几个人.(因为人是固定的7个人)这个要绕一绕.
其次,最重要的就是dfs()传参. 首先是还剩几个点没去,其次是上一个站点,最后是距离.(别问我怎么想的,我一开始也是别人博客的)
那么思路就是;
首先存储要去的点.然后dfs然后比较距离.求最短距离.
重点在dfs的传参 和 if判断(如果所有人都下车了那么比较距离)
那就上代码了.
//#include<stdio.h>//下沙小面的2
//#include<string.h>
//int n,k,kk,min;
//int city[35][35],vis[35];
//void dfs(int r,int flag,int dis)//r代表已经去过地点的次数,flag代表上一个去过的地点,dis表示总距离
//{
// if(r==kk)//如果乘客全都下车了,则比较总路程,更新最小值.
// {
// min=min>dis?dis:min;
// return ;
// }
// for(int i=0; i<n; i++)//遍历每个地点,如果有要去的地点则进入.
// {
// if(vis[i])
// {
// vis[i]=0;
// dfs(r+1,i,dis+city[flag][i]);
// vis[i]=1;
// }
// }
//}
//int main()
//{
// int i,j;
// while(~scanf("%d",&n)&&n)
// {
// kk=0;
// min=1000000;
// memset(vis,0,sizeof(vis));
// for(i=0; i<n; i++)
// for(j=0; j<n; j++)
// scanf("%d",&city[i][j]);
//
// scanf("%d",&k);//将要去的地点标记.
// for(i=0; i<k; i++)
// {
// scanf("%d",&j);
// if(!vis[j])//并且标记.通过vis下标来表示要去的地点,内容来判断这些地点是否要去
// {
// vis[j]=1;
// kk++;//并且记录多少个要去的不同地点.
// }
// }
//
// dfs(0,0,0);
// printf("%d\n",min);
// }
//}
ps:2018年4月10日 02:37:16
大半夜的写博客.精神恍恍惚惚的.这样不好,但只有晚上能挤出多余的时间来追上或者超越他们.
虽然之前做过一遍了但是思路不是很清楚,恍恍惚惚,看博客做完了.感觉自己掌握的并不好.
啊,好烦啊,但是只要多做总有一天我会自己处理理解的吧.
加油啊!!!!!!!
绝不能堕落下去,绝对要进省赛集训啊.