码迷,mamicode.com
首页 > 其他好文 > 详细

hdu5402 Travelling Salesman Problem

时间:2015-09-11 16:00:22      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:

当n,m有一个为奇数时,所有点都可被覆盖。

当n,m全为偶数时,考虑从方格上的点(i,j)走到相邻点,其横纵坐标之和的奇偶性改变一次,因此从偶数点(1,1)走到偶数点(n,m),

经过的偶数点比奇数点多一,由于表格上的奇数点数目和偶数点相同,因此至少有一个奇数点不被遍历,找出并绕过该点即可。

路径经过构造可得。

 

http://acm.hdu.edu.cn/listproblem.php?vol=45

 

技术分享
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 const int maxn = 1e2 + 10;
 8 const int inf = 0x3f3f3f3f;
 9 
10 int G[maxn][maxn];
11 int n, m, x1, y1, low;
12 int sum;
13 
14 int main(){
15     //freopen("in.txt", "r", stdin);
16     while(~scanf("%d%d", &n, &m)){
17         low = inf;
18         sum = 0;
19         for(int i = 1; i <= n; i++){
20             for(int j = 1; j <= m; j++){
21                 scanf("%d", &G[i][j]);
22                 sum += G[i][j];
23                 if((i + j) % 2 && G[i][j] < low) low = G[i][j], x1 = i, y1 = j;
24             }
25         }
26         if(n % 2){
27             printf("%d\n", sum);
28             for(int i = 1; i < m; i++) putchar(R);
29             for(int i = 0; i < (n - 1) / 2; i++){
30                 putchar(D);
31                 for(int j = 1; j < m; j++) putchar(L);
32                 putchar(D);
33                 for(int j = 1; j < m; j++) putchar(R);
34             }
35             putchar(\n);
36             continue;
37         }
38         if(m % 2){
39             printf("%d\n", sum);
40             for(int i = 1; i < n; i++) putchar(D);
41             for(int i = 0; i < (m - 1) / 2; i++){
42                 putchar(R);
43                 for(int j = 1; j < n; j++) putchar(U);
44                 putchar(R);
45                 for(int j = 1; j < n; j++) putchar(D);
46             }
47             putchar(\n);
48             continue;
49         }
50         printf("%d\n", sum - low);
51         if(y1 % 2){
52             for(int i = 0; i < x1 / 2 - 1; i++){
53                 for(int j = 1; j < m; j++) putchar(R);
54                 putchar(D);
55                 for(int j = 1; j < m; j++) putchar(L);
56                 putchar(D);
57             }
58             for(int i = 0; i < (y1 - 1) / 2; i++) printf("DRUR");
59             printf("RD");
60             for(int i = 0; i < (m - y1 - 1) / 2; i++) printf("RURD");
61             for(int i = 0; i < (n - x1) / 2; i++){
62                 putchar(D);
63                 for(int j = 1; j < m; j++) putchar(L);
64                 putchar(D);
65                 for(int j = 1; j < m; j++) putchar(R);
66             }
67             putchar(\n);
68             continue;
69         }
70         for(int i = 0; i < (x1 - 1) / 2; i++){
71             for(int j = 1; j < m; j++) putchar(R);
72             putchar(D);
73             for(int j = 1; j < m; j++) putchar(L);
74             putchar(D);
75         }
76         printf("DR");
77         for(int i = 0; i < (y1 - 2) / 2; i++) printf("URDR");
78         for(int i = 0; i < (m - y1) / 2; i++) printf("RURD");
79         for(int i = 0; i < (n - x1 - 1) / 2; i++){
80             putchar(D);
81             for(int j = 1; j < m; j++) putchar(L);
82             putchar(D);
83             for(int j = 1; j < m; j++) putchar(R);
84         }
85         putchar(\n);
86     }
87     return 0;
88 }
View Code

 

hdu5402 Travelling Salesman Problem

标签:

原文地址:http://www.cnblogs.com/astoninfer/p/4800966.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!