HDU 5402 模拟 构造 Travelling Salesman Problem
题意:
有一个n * m的数字矩阵,每个格子放着一个非负整数,从左上角走到右下角,每个格子最多走一次,问所经过的格子的最大权值之和是多少,并且输出一个路径。
分析:
如果n和m有一个是偶数的话,那么只要按照蛇形的走法一直走下去即可。
比如n为奇数的时候就这样,左右左右地蛇形走。

同样的,如果m为奇数的时候,也可以上下上下地蛇形走。
但如果n和m都为偶数的时候,就会无法走完全部的格子,最终到达右下角。
但是可以少走一个格子,而且这个格子必须是那种行标加列标为奇数的格子才行(行和列从1开始),所以我们就绕过权值最小的符合条件的格子,走其他所有的格子获得最大值。
比如像这种:

除了那个选出来的格子不走,其余的格子可以全部走到。
所以就直接这样构造出一条路径出来。
我们可以这样构造,假设选出来的不走的格子为(x, y),把这个地图分成三部分:选第x行和相邻的一行,这两个作为一个「长城」的走法。
然后「长城」上面和下面用蛇字形走法,最后走到右下角。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = + ; int n, m, sum, _min;
int a[maxn][maxn]; int r, c; bool vis[maxn][maxn]; void snake(int n, int m, char d, char revd, char nxt)
{
for(int i = ; i <= n; i++)
{
if(i & )
{
for(int j = ; j < m; j++) printf("%c", d);
if(i < n) printf("%c", nxt);
}
else
{
for(int j = ; j < m; j++) printf("%c", revd);
if(i < n) printf("%c", nxt);
}
}
} int main()
{
while(scanf("%d%d", &n, &m) == && n)
{
sum = ;
_min = ;
for(int i = ; i <= n; i++)
for(int j = ; j <= m; j++)
{
scanf("%d", &a[i][j]);
sum += a[i][j];
if(((i + j) & ) && a[i][j] < _min) { _min = a[i][j]; r = i; c = j; }
} if(n & )
{
printf("%d\n", sum);
snake(n, m, 'R', 'L', 'D');
puts("");
continue;
} if(m & )
{
printf("%d\n", sum);
snake(m, n, 'D', 'U', 'R');
puts("");
continue;
} printf("%d\n", sum - _min); if(r - > ) snake(r - , m, 'R', 'L', 'D');
if(r - > ) printf("D"); int x, y, up, down;
if(r <= )
{
x = y = ;
up = , down = ;
}
else
{
up = r - , down = r;
x = r - ;
if(r & ) y = m; else y = ;
} memset(vis, false, sizeof(vis));
for(int i = ; i <= n + ; i++) vis[i][] = vis[i][m + ] = true;
for(int i = ; i <= m + ; i++) vis[][i] = vis[n + ][i] = true;
vis[x][y] = true;
vis[r][c] = true;
if(y == )
{
for(int i = ; i <= m * - ; i++)
{
if(x == down)
{
if(!vis[x-][y]) { x--; vis[x][y] = true; printf("U"); }
else { y++; vis[x][y] = true; printf("R"); }
}
else
{
if(!vis[x+][y]) { x++; vis[x][y] = true; printf("D"); }
else { y++; vis[x][y] = true; printf("R"); }
}
}
}
else
{
for(int i = ; i <= m * - ; i++)
{
if(x == down)
{
if(!vis[x-][y]) { x--; vis[x][y] = true; printf("U"); }
else { y--; vis[x][y] = true; printf("L"); }
}
else
{
if(!vis[x+][y]) { x++; vis[x][y] = true; printf("D"); }
else { y--; vis[x][y] = true; printf("L"); }
}
}
} if(down + <= n)
{
printf("D");
if(y == ) snake(n - down, m, 'R', 'L', 'D');
else snake(n - down, m, 'L', 'R', 'D');
} puts("");
} return ;
}
代码君
HDU 5402 模拟 构造 Travelling Salesman Problem的更多相关文章
- 构造 - HDU 5402 Travelling Salesman Problem
Travelling Salesman Problem Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5402 Mean: 现有一 ...
- HDU 5402 Travelling Salesman Problem (构造)(好题)
大致题意:n*m的非负数矩阵,从(1,1) 仅仅能向四面走,一直走到(n,m)为终点.路径的权就是数的和.输出一条权值最大的路径方案 思路:因为这是非负数,要是有负数就是神题了,要是n,m中有一个是奇 ...
- HDU 5402 Travelling Salesman Problem (模拟 有规律)(左上角到右下角路径权值最大,输出路径)
Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (J ...
- HDOJ 5402 Travelling Salesman Problem 模拟
行数或列数为奇数就能够所有走完. 行数和列数都是偶数,能够选择空出一个(x+y)为奇数的点. 假设要空出一个(x+y)为偶数的点,则必须空出其它(x+y)为奇数的点 Travelling Salesm ...
- PAT-1150(Travelling Salesman Problem)旅行商问题简化+模拟图+简单回路判断
Travelling Salesman Problem PAT-1150 #include<iostream> #include<cstring> #include<st ...
- PAT A1150 Travelling Salesman Problem (25 分)——图的遍历
The "travelling salesman problem" asks the following question: "Given a list of citie ...
- PAT 甲级 1150 Travelling Salesman Problem
https://pintia.cn/problem-sets/994805342720868352/problems/1038430013544464384 The "travelling ...
- 1150 Travelling Salesman Problem(25 分)
The "travelling salesman problem" asks the following question: "Given a list of citie ...
- PAT_A1150#Travelling Salesman Problem
Source: PAT A1150 Travelling Salesman Problem (25 分) Description: The "travelling salesman prob ...
随机推荐
- P4874 回形遍历 —模拟
思路: 写完后信心满满,结果超时. 我很不解,下了个数据结果——,z竟然是大于1e10的,跟题目给的不一样啊 原来如此,正解是一行一行的走的... 注意当到两边一样近时,应优先向下和右!!!!!! 这 ...
- MVC的viewPage 通用属性运用。
试想下在MVC的前端页面JS或者html中需要使用多语言,而后端的多语言是维护在资源文件中的,前端如果使用的话需要使用AJAX频繁的获取,一个页面中可能会存在大量的需要语言转换的地方,频繁使用AJAX ...
- swift基础-3
fallthrough 贯穿 case 可以不必写break 如果不需要知道区间内 每一项的值 可以使用 下划线 —— 来代替变量名 忽略 对该值的访问 for index in 1...5{ p ...
- When you want to give up, remember why you started.
When you want to give up, remember why you started.当你想要放弃的时候,请记住当初你为何而开始.
- Kendo MVVM 数据绑定(一) attr
Kendo MVVM 数据绑定(一) attr Kendo UI MVVM 数据绑定支持的绑定属性有 attr, checked, click, custom , disabled,enabled, ...
- javascript组件封装中一段通用代码解读
有图有真相,先上图. 相信很多想去研究源码的小伙伴一定被这段代码给吓着了把,直接就打消了往下看下去的想法.我刚开始看的时候也是有点一头雾水,这是什么东东这么长,但是慢慢分析你就会发现其中的奥秘,且听我 ...
- Echarts获取数据绘制图表
这次是利用mui框架实现一个手机移动端的项目.基本的框架已经实现,主要来获取数据实现一个图表的展示. 首先引入插件:echarts.js <script src="../resourc ...
- xcode在代码中查找中文
总是忘记xcode中查找中文,这次记下来,以后就不会忘记了,哈哈 请看下图: 切换到查找,点击find后面的text,选择Regular Expression,然后输入 1. 查找非ascii的字符 ...
- JavaScript_11_验证
表单验证: JavaScript可用来在数据被送往服务器前对HTML表单中的输入数据进行验证 1. 是否填写了必填项目 2. 邮件地址是否合法 ... <form action="su ...
- 记一次RabbitMq 安装和配置坑
记一次RabbitMq 安装和配置坑 正常情况下安装 先安装erl ,在安装rabbitmq 这个在windows下的安装没什么技巧,按照默认一路下一步就ok.安装好后可以到cmd测试是否安装好. 测 ...