Gridland 的总统雇佣你来编写一个程序,计算在这个国家中所有城市的旅行售货员问题的最短距离。在Gridland,每个城市都位于矩形网格的一个点上。通向每个城市的道路只有东、西、南、北、东南、东北、西南、和西北方向,在每个方向上只有一个相邻的城市。东西、南北方向上的长度为1.长度单位是欧几里得距离。如图所示是一个2X3的Griland,最短的环游路线长度是6。
输入:
第一行是测试例数
每个测试例,在一行里有两个整数m和n(1<m, n<50),中间有一个空格,是二维栅格的大小。
输出:对每个测试例,第一行输出:“Scenario #i:”, i是从1开始的测试例编号。第二行输出售后员环游问题的最短路长度,精确到两位小数。每个测试例之后有一个空行。
Sample input
2 2 2 2 3
Sample output
Scenario #1: 4.00
Scenario #2: 6.00
Source: Northwestern Europe 2001
分析:
刚开始误导解题者往最小路径,图论方向考虑,另外题目表达也不是很清楚,
题目大意就是说,有一个叫gridland的国家,给出n个城市,及城市之间的距离,问题是寻找一条最短路径让售货员访问每个城市一次且只有一次,又回到出发点,gridland的总统让你去编写一个程序,计算在这个国家中所有城市的旅行售货员问题的最短长度,在gridland,每个城市位于矩形网络的一个点上,通向每个城市的道路只有东,西,南,北,东北,东南,西南,西北,方向,在每个方向只有一个相邻的城市,,东西南北方向上的长度为1,长度单位为欧几里得距离,如图,最短环游路线长度是6。
算法分析:通过简单的画图,我们可以得知,如果输入的长与宽的乘积为偶数那么最短的距离就是长与宽的乘积,即最短距离为m*n,如果输入的长与宽的乘积为奇数,那么就需要走一条斜边来代替一条直边,即最短距离为m*n +sqrt(2)-1, 注意结果要保留两位小数!
参考代码:
#include<stdio.h> int main() { int t, n, m, i = 0; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); printf("# %d:\n",++i); if(m*n%2!=0) printf("%d.41\n",m*n); else printf("%d.00\n",m*n); } return 0; }