题意:
将一个矩形划分成单位矩形。问从一个点出发,经过所有单位矩形的顶点1次后,回到起点的最短路径的长度是多少。
思路:
用个专业点的说法,题目求的是哈密顿回路的最短长度。其实是数学推断题。首先可以得出的是,矩形的长宽是可以调转的,这并不影响最后结果。考虑一条S型的路线,从左上角的顶点出发,走一条S型的路线以最短距离走完最多的顶点,然后最后再尽量取最短路走完剩下的点。长为奇数与偶数时,最短路径的走法如图所示。
由此推断,两种走法都是与宽的奇偶性无关的。第一种情况,路径长度就是长宽之积;第二种情况,走到最后一个格的长度是长宽之积-1,再加上最后一个格到终点的距离,sqrt(2)。对比两种情况的路径长度可知,当长宽为一奇一偶时,应按照第一种情况计算。
1 2 3 4 1 2 3 4 5
16 7 6 5 24 25 14 13 6
15 8 9 10 23 22 15 12 7
14 13 12 11 20 21 16 11 8
19 18 17 10 9
#include<stdio.h> #include<math.h> int main() { int N; int n,m; int i=0; scanf("%d",&N); while(N--) { i++; scanf("%d %d",&n,&m); if(n%2==1&&m%2==1)printf("Scenario #%d:\n%.2lf\n\n",i,((double)n*m-1+sqrt(2.0))); else printf("Scenario #%d:\n%.2lf\n\n",i,(double)n*m); } return 0; }
**注意:
sqrt(2)会判编译错误,正确写法为sqrt(2.0)。