题意:

有一个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的更多相关文章

  1. 构造 - HDU 5402 Travelling Salesman Problem

    Travelling Salesman Problem Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5402 Mean: 现有一 ...

  2. HDU 5402 Travelling Salesman Problem (构造)(好题)

    大致题意:n*m的非负数矩阵,从(1,1) 仅仅能向四面走,一直走到(n,m)为终点.路径的权就是数的和.输出一条权值最大的路径方案 思路:因为这是非负数,要是有负数就是神题了,要是n,m中有一个是奇 ...

  3. HDU 5402 Travelling Salesman Problem (模拟 有规律)(左上角到右下角路径权值最大,输出路径)

    Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (J ...

  4. HDOJ 5402 Travelling Salesman Problem 模拟

    行数或列数为奇数就能够所有走完. 行数和列数都是偶数,能够选择空出一个(x+y)为奇数的点. 假设要空出一个(x+y)为偶数的点,则必须空出其它(x+y)为奇数的点 Travelling Salesm ...

  5. PAT-1150(Travelling Salesman Problem)旅行商问题简化+模拟图+简单回路判断

    Travelling Salesman Problem PAT-1150 #include<iostream> #include<cstring> #include<st ...

  6. PAT A1150 Travelling Salesman Problem (25 分)——图的遍历

    The "travelling salesman problem" asks the following question: "Given a list of citie ...

  7. PAT 甲级 1150 Travelling Salesman Problem

    https://pintia.cn/problem-sets/994805342720868352/problems/1038430013544464384 The "travelling ...

  8. 1150 Travelling Salesman Problem(25 分)

    The "travelling salesman problem" asks the following question: "Given a list of citie ...

  9. PAT_A1150#Travelling Salesman Problem

    Source: PAT A1150 Travelling Salesman Problem (25 分) Description: The "travelling salesman prob ...

随机推荐

  1. Angular2中实现基于TypeScript的对象合并方法:extend()

    TypeScript里面没有现成的合并对象的方法,这里借鉴jQuery里的$.extend()方法.写了一个TypeScript的对象合并方法,使用方法和jQuery一样. 部分代码和jQuery代码 ...

  2. Vue部分知识

    一.本尊建议的学习顺序:https://zhuanlan.zhihu.com/p/23134551(侵删) 二.安装: 1.安装 Node.js,可以去Node.js的官网上下载: 2.(非必选)如果 ...

  3. Hello World另类写法

    #include<iostream> #define _ using namespace std; #define __ int main() #define ___ { #define ...

  4. ECSHOP 商品增加新字段的方法

    在ecshop二次开发工作中,经常碰到一些ECSHOP高级使用者问我,如何给商品增加一个新字段,来录入一些新的内容. 下面我们结合ecshop后台“商品编辑”.“商品录入”来谈谈如何给ecshop商品 ...

  5. Docker的下载安装以及简单使用

    Docker的简介 Docker是一个基于GO语言开发的应用容器,它是一款适合运维人员和后段开发人员学习的开源容器引擎.Docker容器可以让开发的应用或者依赖包存储其中,可以运行在任何的Linux ...

  6. informix服务端卸载后重新安装不成功

    可能原因: 1.实例未删除 2.配置文件未删除 安装成功后远程客户端连接不上问题: 1..如果自己设置的数据库实例报错,换一个数据库实例(database)试试,例如sysadmin

  7. python 之 re 模块

    re模块下的常用方法 1.findall:返回所有满足匹配条件的结果,放在列表里. import re # 查找数字 result = re.findall('\d+','nizhidao 123 w ...

  8. javaSe-线程2

    package com.java.chap09.sec02; public class Thread3 implements Runnable{ private int baoZi=1; privat ...

  9. 微软Bot Framework文档中,关于Sign-in Card的一处代码错误及更正

    Bot Framework文档出错处网址:https://docs.botframework.com/en-us/csharp/builder/sdkreference/attachments.htm ...

  10. WebClient UI和Tomcat的启动器

    WebClient UI 我们在WebClient UI的开发工具里点了Test按钮, 会在浏览器以测试模式打开选中的view.这背后发生了什么事?注意浏览器地址栏的bspwd_cmp_test,这是 ...