题意是要在一个矩形点阵中求能从一点出发遍历所有点再回到起始点的最短路径长度。
不需要用到搜索什么的,可以走一个“梳子型”即可完成最短路径,而情况可以被分成如下两种:
一、矩形的长或宽中有偶数,则可以走出如图示的路径:
路径长 = 总点数 + 1 = n*m + 1;
二、矩形的长和宽均为奇数,则可以走出如图示的路径:
路径长 = 总点数 + 根号2 - 1 = n*m + sqrt(2) - 1;
代码如下:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int t,n,m; 6 double ans; 7 scanf("%d",&t); 8 for(int i = 1; i <= t; ++i) 9 { 10 scanf("%d %d",&n,&m); 11 printf("Scenario #%d: ",i); 12 if(!(n&1)||!(m&1)) ans = (double)n*m; 13 else ans = (double)n*m-1+sqrt(2.0); 14 printf("%.2lf ",ans); 15 } 16 return 0; 17 }