题意:

有一个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. Json 后台转对象的方式或者获取属性值方式。

    类似这类的 json字符串 后台转成 model 或者取其中一个属性值. 需要去掉前后引号 以及将转义字符去掉.空格代替 resoult = resoult.Substring(0, resoult. ...

  2. java容器集合

    java 集合分为 Collection 和 Map 两大类 Collection 是 Java 集合框架的顶层接口,它是对容器类进行增.删.改.查的定义,同时继承了 Iterable 接口,具有对集 ...

  3. VirtualBox中出现UUID have already exists ,并且数字键盘numlock效果相反

    原文地址:https://www.cnblogs.com/xqzt/p/5053338.html 原因:由于linux密码登录错误,修改也报错误,所以只能重新安装虚拟机并在其中安装镜像文件,但是安装镜 ...

  4. leetcode84 Largest Rectangle in Histogram

    思路: 使用单调栈计算每个位置左边第一个比它矮的位置和右边第一个比它矮的位置即可. 实现: #include <bits/stdc++.h> using namespace std; cl ...

  5. [20190611]记录一下github的基本用法

    本文记录如何使用github创建项目并上传代码,因为有一段时间没用github了,中途又重装了系统,今天重新使用一下. 然后特地做简要记录: 1. 创建SSH Key SSH Key指一般在C:\Us ...

  6. android图片缩放平移

    <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android=" ...

  7. WinForm form属性

    一.布局 Autostroll   控件内容大于可见区域是否自动显示滚动条 Maximumsize 窗体可调到最大尺寸 minimumsize  窗体可调到最小尺寸 size  窗体看到的尺寸 Sta ...

  8. UESTC 1307 WINDY数 (数位DP,基础)

    题意: windy定义了一种windy数.不含前导零且相邻两个数字之差至少为2的正整数被称为windy数.windy想知道,在A和B之间,包括A和B,总共有多少个windy数? 思路: 就是给连续的两 ...

  9. LibreOJ #107. 维护全序集

    内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 上传者: 匿名   splay模板题 屠龙宝刀点击就送 #include <cstdio&g ...

  10. python基础教程总结2——字符串

    1.基本操作 序列操作:索引,分片,乘法,判断成员资格,长度,最值...... 注:字符串不可变,分片赋值不合法 2.字符串格式化 模板 格式化字符串时,Python使用一个字符串作为模板.模板中有格 ...