hdu 5402 Travelling Salesman Problem(构造+棋盘黑白染色)
来源:互联网 发布:专业配音软件 编辑:程序博客网 时间:2024/05/12 19:09
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5402
解题思路:
官方题解:
首先如果n为奇数或者m为奇数,那么显然可以遍历整个棋盘。
如果n,m都为偶数,那么讲棋盘黑白染色,假设(1,1)和(n,m)都为黑色,那么这条路径中黑格个数比白格个数多1,而棋盘中黑白格子个数相同,所以必然有一个白格不会被经过,所以选择白格中权值最小的不经过。
构造方法是这样,首先RRRRDLLLLD这样的路径走到这个格子所在行或者上一行,然后DRUR这样走到这个格子的所在列或者前一列,然后绕过这个格子。然后走完这两行,接着按LLLLDRRRR这样的路径往下走。
赛后,我是看了这个人画的图才懂得。。。http://blog.csdn.net/wangcong9614/article/details/47775231最后自己再画一画图,果然如此:
若n或m只要其中一个为奇数,则肯定能走完所有的格子;
若n和m都为偶数的话,根据棋盘黑白染色(关于棋盘黑白染色问题,想了解的可以点传送门)可以得知,当假设(1,1)与(n,m)都为黑色,那么这条路径势必黑色格子数会比白色格子数多1,而棋盘中黑白格子数是相等的,所以棋盘中会有一个白格子不会被经过
AC代码:
#include <iostream>#include <cstdio>using namespace std;const int N = 105;int s[N][N];int main(){ int n,m,sum,x,y; while(~scanf("%d%d",&n,&m)){ sum = 0;x = 1;y = 2; for(int i = 1; i <= n; i++) for(int j = 1; j <= m; j++) { scanf("%d",&s[i][j]); sum += s[i][j]; if(((i+j)&1) && s[x][y]>s[i][j]) x = i,y = j; } if(n&1 || m&1) { printf("%d\n",sum); if(n&1) { for(int i = 1; i <= n; i++) { for(int j = 1; j < m; j++) if(i&1) printf("R"); else printf("L"); if(i < n) printf("D"); else printf("\n"); } } else { for(int i = 1; i <= m; i++) { for(int j = 1; j < n; j++) if(i&1) printf("D"); else printf("U"); if(i<m) printf("R"); else printf("\n"); } } } else { printf("%d\n",sum-s[x][y]); for(int i = 1; i <= n; i+=2) { if(x==i || x==i+1) { for(int j = 1; j < y; j++) { if(j&1) printf("D"); else printf("U"); printf("R"); } if(y < m) printf("R"); for(int j = y+1; j <= m; j++) { if(j&1) printf("U"); else printf("D"); if(j < m) printf("R"); } if(i < n-1) printf("D"); } else if(x < i) { for(int j = 1; j < m; j++) printf("L"); printf("D"); for(int j = 1; j < m; j++) printf("R"); if(i < n-1) printf("D"); } else { for(int j = 1; j < m; j++) printf("R"); printf("D"); for(int j = 1; j < m; j++) printf("L"); printf("D"); } } printf("\n"); } } return 0;}
0 0
- hdu 5402 Travelling Salesman Problem(构造+棋盘黑白染色)
- HDU 5402 Travelling Salesman Problem(棋盘染色 构造 多校啊)
- Hdu 5402 Travelling Salesman Problem 棋盘黑白染色
- hdu 5402 Travelling Salesman Problem(模拟,棋盘染色问题)
- HDU 5402 Travelling Salesman Problem(棋盘黑白染色)——多校练习9
- 2015多校第九场 HDU 5402 Travelling Salesman Problem 棋盘染色法,构造
- 【HDU 5402】Travelling Salesman Problem(构造)
- hdu 5402 Travelling Salesman Problem(构造)
- hdu5402 Travelling Salesman Problem(棋盘染色+模拟)
- HDU 5402 (构造题)Travelling Salesman Problem
- hdu 5402 Travelling Salesman Problem (构造)
- hdu 5402 Travelling Salesman Problem 模拟构造
- hdu 5402 Travelling Salesman Problem(构造+模拟)
- HDU 5402 Travelling Salesman Problem (构造)(好题)
- HDU 5402 Travelling Salesman Problem(组合数学+构造)
- Travelling Salesman Problem (hdu 5402 模拟)
- HDU-5402 Travelling Salesman Problem(模拟)
- HDU 5402 Travelling Salesman Problem
- 使用VirtualBox自带管理工具命令为虚拟磁盘扩展空间
- Xcode6创建带有TabBarController及其Item 的项目
- 创建centos7下的加密移动硬盘
- 局域网访问隔离
- 数组分组
- hdu 5402 Travelling Salesman Problem(构造+棋盘黑白染色)
- Unity5混音器DSP插件编写教程【一】
- hdoj.4165 Pills【卡特兰数列】 2015/08/27
- 浏览器加载渲染网页过程解析
- textarea和mysql中的换行符问题
- Java String对象的经典问题(new String())
- Java串行化深度复制与性能调优
- The Euler function HDU杭电2824 【欧拉函数打表】
- SpringMVC总结