HDOJ 5402 Travelling Salesman Problem 模拟
行数或列数为奇数就能够所有走完.
行数和列数都是偶数,能够选择空出一个(x+y)为奇数的点.
假设要空出一个(x+y)为偶数的点,则必须空出其它(x+y)为奇数的点
Travelling Salesman Problem
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 747 Accepted Submission(s): 272
Special Judge
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.
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.
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).
3 3
2 3 3
3 3 3
3 3 2
25
RRDLLDRR
/* ***********************************************
Author :CKboss
Created Time :2015年08月19日 星期三 13时43分44秒
File Name :HDOJ5402.cpp
************************************************ */ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map> using namespace std; int n,m;
int g[110][110];
char dir[110][110]; char loop_down[4]={'R','D','L','D'};
char loop_up[4]={'R','U','L','U'}; void R(int &x,int &y) { y+=1; }
void L(int &x,int &y) { y-=1; }
void U(int &x,int &y) { x-=1; }
void D(int &x,int &y) { x+=1; } string road; string UP_TO_DOWN(int x,int y)
{
string midroad="";
memset(dir,'.',sizeof(dir));
dir[x][y]='$';
int curx=1,cury=1;
for(int i=1,id=0;i<2*n;i++,id++)
{
int nx=curx,ny=cury;
if(loop_down[id%4]=='R') R(nx,ny);
else if(loop_down[id%4]=='L') L(nx,ny);
else if(loop_down[id%4]=='U') U(nx,ny);
else if(loop_down[id%4]=='D') D(nx,ny); if(dir[nx][ny]=='.')
{
dir[curx][cury]=loop_down[id%4];
midroad+=dir[curx][cury];
curx=nx; cury=ny;
}
else if(dir[nx][ny]=='$')
{
dir[curx][cury]='D';
midroad+=dir[curx][cury];
D(curx,cury);
id=3;
}
}
midroad[midroad.length()-1]='R';
return midroad;
} string DOWN_TO_UP(int x,int y)
{
string midroad="";
memset(dir,'.',sizeof(dir));
dir[x][y]='$';
int curx=n,cury=1;
for(int i=1,id=0;i<2*n;i++,id++)
{
int nx=curx,ny=cury;
if(loop_up[id%4]=='R') R(nx,ny);
else if(loop_up[id%4]=='L') L(nx,ny);
else if(loop_up[id%4]=='U') U(nx,ny);
else if(loop_up[id%4]=='D') D(nx,ny); if(dir[nx][ny]=='.')
{
dir[curx][cury]=loop_up[id%4];
midroad+=dir[curx][cury];
curx=nx; cury=ny;
}
else if(dir[nx][ny]=='$')
{
dir[curx][cury]='U';
midroad+=dir[curx][cury];
U(curx,cury);
id=3;
}
}
midroad[midroad.length()-1]='R'; return midroad;
} void SHOW(int x,int y)
{
road="";
memset(dir,'.',sizeof(dir));
dir[x][y]='$';
if(y==1)
{
/// S road
int curx=1,cury=1,id=0;
for(int i=0;i<2*n-1;i++,id++)
{
int nx=curx,ny=cury;
if(loop_down[id%4]=='R') R(nx,ny);
else if(loop_down[id%4]=='L') L(nx,ny);
else if(loop_down[id%4]=='U') U(nx,ny);
else if(loop_down[id%4]=='D') D(nx,ny); if(dir[nx][ny]=='.')
{
dir[curx][cury]=loop_down[id%4];
road+=dir[curx][cury];
curx=nx; cury=ny;
}
else if(dir[nx][ny]=='$')
{
if(nx==n)
{
dir[curx][cury]='L';
road+=dir[curx][cury];
L(curx,cury);
}
else
{
dir[curx][cury]='D';
road+=dir[curx][cury];
D(curx,cury);
id=1;
}
}
}
road[road.length()-1]='R';
for(int i=3;i<=m;i++)
{
for(int j=1;j<n;j++)
{
if(i%2==0) road+='D';
else road+='U';
}
road+='R';
}
}
else
{
for(int i=1;i<y-1;i++)
{
for(int j=1;j<n;j++)
{
if(i%2==1) road+='D';
else road+='U';
}
road+='R';
}
if(y%2==0)
{
/// from up to down
road+=UP_TO_DOWN(x,2);
for(int i=y+1,id=0;i<=m;i++,id++)
{
for(int j=1;j<n;j++)
{
if(id%2==0) road+='U';
else road+='D';
}
road+='R';
}
}
else if(y&1)
{
/// from down to up
road+=DOWN_TO_UP(x,2);
for(int i=y+1,id=0;i<=m;i++,id++)
{
for(int j=1;j<n;j++)
{
if(id%2==0) road+='D';
else road+='U';
}
road+='R';
}
}
}
} int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout); while(scanf("%d%d",&n,&m)!=EOF)
{
int sum=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&g[i][j]);
sum+=g[i][j];
}
}
if(n&1)
{
printf("%d\n",sum);
for(int i=1;i<=n;i++)
{
for(int j=1;j<m;j++)
{
if(i&1) putchar('R');
else putchar('L');
}
if(i!=n) putchar('D');
}
putchar(10);
}
else if(m&1)
{
printf("%d\n",sum);
for(int i=1;i<=m;i++)
{
for(int j=1;j<n;j++)
{
if(i&1) putchar('D');
else putchar('U');
}
if(i!=m) putchar('R');
}
putchar(10);
}
else
{
int mi=999999999;
int px,py;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if((i+j)%2)
{
if(mi>g[i][j])
{
mi=min(mi,g[i][j]);
px=i; py=j;
}
}
}
}
printf("%d\n",sum-mi);
SHOW(px,py);
road[road.length()-1]=0;
cout<<road<<endl;
}
} return 0;
}
HDOJ 5402 Travelling Salesman Problem 模拟的更多相关文章
- hdoj 5402 Travelling Salesman Problem
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5402 类似于黑白棋盘,有的格子是可以不走的,有的格子是不能不走的,对于m或n中有一个奇数的情况, 所有 ...
- HDU 5402 Travelling Salesman Problem (模拟 有规律)(左上角到右下角路径权值最大,输出路径)
Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 65536/65536 K (J ...
- 构造 - 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(多校9 模拟)
题目链接:pid=5402">http://acm.hdu.edu.cn/showproblem.php?pid=5402 题意:给出一个n×m的矩阵,位置(i.j)有一个非负权值. ...
- hdu 5402 Travelling Salesman Problem(大模拟)
Problem Description Teacher Mai ,) to the bottom right corner (n,m). He can choose one direction and ...
- HDU 5402 Travelling Salesman Problem(棋盘染色 构造 多校啊)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5402 Problem Description Teacher Mai is in a maze wit ...
- hdu 5402 Travelling Salesman Problem (技巧,未写完)
题意:给一个n*m的矩阵,每个格子中有一个数字,每个格子仅可以走一次,问从(1,1)走到(n,m) 的路径点权之和. 思路: 想了挺久,就是有个问题不能短时间证明,所以不敢下手. 显然只要n和m其中一 ...
- HDU 5402 : Travelling Salesman Problem
题目大意:n*m的格子,从左上角走到右下角,每个格子只能走一遍,每个格子上有一个非负数,要让途径的数字和最大,最后要输出路径 思路:显然茹果n,m有一个是奇数的话所有格子的数字都能被我吃到,如果都是偶 ...
随机推荐
- 编写UI自动化测试用例原则
1.一个脚本是一个完整的场景,从用户登陆操作到用户退出系统关闭浏览器.2.一个脚本脚本只验证一个功能点,不要试图用户登陆系统后把所有的功能都进行验证再退出系统3.尽量只做功能中正向逻辑的验证,不要考虑 ...
- [转]微信开发.Net 接入示例
本文转自:http://my.oschina.net/lcak/blog/219618 微信公众平台接口开发官方仅提供了 PHP 接入示例代码, 网上找到的.Net代码多半需要积分下载, 所以自己写了 ...
- HTML5 WEB Storage - localStorage存储位置在哪
localStorage作为客户端浏览器持久化存储方案 这个是浏览器隔离的,每个浏览器都会把localStorage存储在自己的UserData中,如chrome一般就是 C:\Users\你的计算机 ...
- 【C++】智能指针简述(五):解决循环引用的weak_ptr
总结一下前文内容: 1.智能指针通过RAII方法来管理指针:构造对象时,完成资源初始化;析构对象时,对资源进行清理及汕尾. 2.auto_ptr,通过“转移所有权”来防止析构一块内存多次.(如何转移? ...
- thinkphp配置设置
thinkphp惯例文件是不可更改的,有配置设置通常在Application->Commen->Conf->config.php更改. 绑定数据库信息 //'配置项'=>'配置 ...
- JS高级——监听浏览器的返回事件
https://www.cnblogs.com/Easty/p/7820055.html https://www.cnblogs.com/zhengyan/p/6912526.html http:// ...
- angular 琐碎
1.controller 只要在一个地方引用就可以了,路由的时候不用指定controller了,在HTML中指定就可以了,否则会初始化两次 2.angular 模块间的服务无层级关系,相互可见.本质是 ...
- 【译】x86程序员手册23-6.5组合页与段保护
6.5 Combining Page and Segment Protection 组合页与段保护 When paging is enabled, the 80386 first evaluates ...
- ubuntu系统nginx+Redis+PHP
一.安装ngnix apt-get update sudo apt-get install nginx /etc/init.d/nginx start 二.安装php sudo apt-get ins ...
- 11Java Server Pages 动作
Java Server Pages 动作 JSP标准动作 分类 JSP标准动作 存取JavaBean相关 <jsp:useBean> <jsp:setProperty> < ...