Problem Description
Teacher Mai is in a maze with n rows
and m columns.
There is a non-negative number in each cell. Teacher Mai wants to walk from the top left corner (1,1) to
the bottom right corner (n,m).
He can choose one direction and walk to this adjacent cell. However, he can't go out of the maze, and he can't visit a cell more than once.

Teacher Mai wants to maximize the sum of numbers in his path. And you need to print this path.
 

Input
There are multiple test cases.

For each test case, the first line contains two numbers n,m(1≤n,m≤100,n∗m≥2).

In following n lines,
each line contains m numbers.
The j-th
number in the i-th
line means the number in the cell (i,j).
Every number in the cell is not more than 104.
 

Output
For each test case, in the first line, you should print the maximum sum.

In the next line you should print a string consisting of "L","R","U" and "D", which represents the path you find. If you are in the cell (x,y),
"L" means you walk to cell (x,y−1),
"R" means you walk to cell (x,y+1),
"U" means you walk to cell (x−1,y),
"D" means you walk to cell (x+1,y).
 

Sample Input

3 3
2 3 3
3 3 3
3 3 2
 

Sample Output

25
RRDLLDRR

第一想法是搜多,但看到100*100的大小,感觉不是搜索题,后来发现是模拟题。如果n或m有一个是奇数,那么一定可以把所有的点都走一遍,这样结果一定是最大的,所以只要考虑都是偶数的情况。我的思路是先把横纵坐标只和为奇数的染成黑色,偶数的染成白色,那么画图可以知道

如果选择一个黑色方格不走,那么其他点都能够走一遍,但如果选择一个白色方格不走,必须要不走另外两个黑色方格才能走到终点,所以 一定是选择最小的黑色方格数不走。

然后选出最小的黑色方格,然后模拟一下走法就行了。

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<string>
#include<algorithm>
using namespace std;
#define inf 99999999
int gra[106][106],n,m,sum;
void jishulu()
{
int i,j;
printf("%d\n",sum);
if(n%2==1){
for(i=1;i<=n;i++){
for(j=1;j<=m-1;j++){
printf("%c",i%2==1?'R':'L');
}
if(i<n)printf("D");
else printf("\n");
}
}
else{
for(j=1;j<=m;j++){
for(i=1;i<=n-1;i++){
printf("%c",j%2==1?'D':'U');
}
if(j<m)printf("R");
else printf("\n");
}
}
} void oushulu()
{
int i,j,minx=inf,dx=0,dy=0,x,y;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
if((i+j)%2==1 && minx>gra[i][j]){
dx=i;dy=j;minx=gra[i][j];
}
}
}
printf("%d\n",sum-minx);
if(dx==n){
for(i=1;i<=n-2;i++){
for(j=1;j<=m-1;j++){
printf("%c",i%2==1?'R':'L');
}
printf("D");
}
if(dy==1){
x=n-1;y=1;
while(1)
{
printf("RD");x++;y++;
if(x==n && y==m){
printf("\n");break;
}
printf("RU");x--;y++;
}
}
else{
printf("D");
x=n;y=1;
while(1)
{
printf("RU");
x--;y++;
if(x+1==dx && y+1==dy){
printf("RRD");x++;y+=2;
}
else{
printf("RD");x++;y++;
}
if(x==n && y==m){
printf("\n");break;
}
}
}
}
else if(dx!=n){
for(i=1;i<=dx-1;i++){
for(j=1;j<=m-1;j++){
printf("%c",i%2==1?'R':'L');
}
printf("D");
}
if(dx%2==1){
printf("D");
x=dx+1;y=1;
if(dy==m){
while(1)
{
if((y+1)!=m){
printf("RURD");y+=2;
}
else{
printf("R");y++;
if(x!=n)printf("D");break;
}
}
}
else{
while(1)
{
if(x-1==dx && y+1==dy){
printf("RRURD");y+=3;
}
else{
printf("RURD");y+=2;
}
if(y==m){
if(x!=n)printf("D");
break;
}
}
}
for(i=dx+2;i<=n;i++){
for(j=1;j<=m-1;j++){
printf("%c",i%2==1?'L':'R');
}
if(i!=n)printf("D");
}
printf("\n"); }
else if(dx%2==0){
printf("D");
x=dx+1;y=m;
if(dy==1){
while(1)
{
if((y-1)!=1){
printf("LULD");y-=2;
}
else{
printf("L");y--;
if(x!=n)printf("D");
break;
}
}
}
else{
while(1)
{
if(x-1==dx && y-1==dy){
printf("LLULD");y-=3;
}
else{
printf("LULD");y-=2;
}
if(y==1){
if(x!=n)printf("D");
break;
}
}
}
if(x!=n){
for(i=dx+2;i<=n;i++){
for(j=1;j<=m-1;j++){
printf("%c",i%2==1?'L':'R');
}
if(i!=n)
printf("D");
}
}
printf("\n"); }
}
} int main()
{
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
sum=0;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
scanf("%d",&gra[i][j]);
sum+=gra[i][j];
}
}
if(n%2==1 || m%2==1){
jishulu();
}
else oushulu();
}
return 0;
}

hdu5402 Travelling Salesman Problem的更多相关文章

  1. [hdu5402 Travelling Salesman Problem]YY

    题意:给一个n*m的矩形,每个格子有一个非负数,求一条从(1,1)到(n,m)的路径(不能经过重复的格子),使得经过的数的和最大,输出具体的方案 思路:对于row为奇数的情况,一行行扫下来即可全部走完 ...

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

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

  3. PAT 甲级 1150 Travelling Salesman Problem

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

  4. 构造 - HDU 5402 Travelling Salesman Problem

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

  5. 1150 Travelling Salesman Problem(25 分)

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

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

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

  7. HDOJ 5402 Travelling Salesman Problem 模拟

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

  8. PAT_A1150#Travelling Salesman Problem

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

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

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

随机推荐

  1. 使用正则表达式和urllib模块爬取最好大学排名信息

    题目 使用urllib模块编程实现爬取网站的大学排名. (网址:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html) (1)获取网站页面,分析代 ...

  2. Openstack Ocata 公共服务端(三)

    Openstack Ocata 公共服务端 mysql 安装: yum install mariadb mariadb-server mysql 安装过程省略 rabbit-server 安装包: # ...

  3. 【Linux】fstab中 每个字段代表的含义

      默认情况下,fstab中已经有了当前的分区配置,内容可能类似: # <file system> <mount point> <type> <options ...

  4. STM32延时函数的四种方法

    单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us()和毫秒级delay_ms().本文基于STM32F207介绍4种不同方式实现的延时函数. 1.普通延时 这种延时方式应该是 ...

  5. SAPCAR使用说明

    1.首先看一下SAPCAR的功能usage:create a new archive:SAPCAR -c[vir][f archive] [-P] [-C directory]   [-A filen ...

  6. 微信登录2-生成授权URL

    一.准备工作 1.注册 微信开放平台:https://open.weixin.qq.com 2.邮箱激活 3.完善开发者资料 4.开发者资质认证 准备营业执照,1-2个工作日审批.300元 5.创建网 ...

  7. mysqldump导出数据库导入数据库

    使用mysqldump命令导出数据库,格式如下,请按实际要求对参数进行替换: mysqldump -u 用户名 -p 数据库名 > 导出的文件名 比如导出数据库business_db: mysq ...

  8. spark开窗函数

    源文件内容示例: http://bigdata.beiwang.cn/laoli http://bigdata.beiwang.cn/laoli http://bigdata.beiwang.cn/h ...

  9. Java并发组件三之Semaphore

    使用场景:常用于使用有限的资源,限制线程并发的最大数量.默认情况下,信号量是非公平性的(先等待先执行为公平.类似于买东西的时候大家排队付款,先来的先付款是公平的.但是这时候有人插队,那就是非公平的)设 ...

  10. JavaScript 实现排序算法

    参考文章: 十大经典排序算法动画,看我就够了! 1. 冒泡排序 思路 比较所有相邻元素,如果第一个比第二个大,则交换它们 一轮下来,可以保证最后一个数是最大的 执行n-1轮,就可以完成排序 代码 Ar ...