NYOJ818ZOJ--1037---Gridland

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;
}


你可能感兴趣的:(ZOJ,数学题,nyoj)