HDU 5402 Travelling Salesman Problem
2015-08-19 16:46
281 查看
HDU 5402 Travelling Salesman Problem
/** HDU 5402 Travelling Salesman Problem 如果行列有一个是奇数,一定可以通过蛇形路径走完全程 否则,将所有位置黑白染色,有一个白色位置的路径无法走到找出最小的 白色路径,构造方式是不走这个路径就可以了 */ #include<algorithm> #include<iostream> #include<cstring> #include<cstdio> using namespace std; int n,m; char s[10005]; int cor; void fun(int l,int t){ char L,R,C; int len; if(t==1){len=m;L='L';R='R';C='D';} else{len=n;L='U';R='D';C='R';} if(l==1) { for(int i=1;i<len;i++) s[cor++]=R; s[cor++]=C; for(int i=1;i<len;i++) s[cor++]=L; s[cor++]=C; } else { for(int i=1;i<len;i++) s[cor++]=L; s[cor++]=C; for(int i=1;i<len;i++) s[cor++]=R; s[cor++]=C; } } int dir[3][2]={1,0,-1,0,0,1}; bool b[3][105]; void out(int x,int y){ memset(b,0,sizeof(b)); b[x][y]=true; b[1][1]=true; x=1,y=1; while(x!=2||y!=m){ for(int i=0;i<3;i++){ int xx=x+dir[i][0]; int yy=y+dir[i][1]; if(xx>=1&&yy>=1&&xx<=2&&yy<=m&&!b[xx][yy]){ b[xx][yy]=true; if(i==0) s[cor++]='D'; else if(i==1) s[cor++]='U'; else s[cor++]='R'; x=xx; y=yy; } } } } int main(){ while(~scanf("%d%d",&n,&m)){ int sum=0,x,y,Min=1000000,a; cor=0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("%d",&a); sum+=a; if((i+j)%2==1&&a<Min){ Min=a;x=i;y=j; } } } if(n%2||m%2){ printf("%d\n",sum); if(n%2){ for(int i=1;i<n;i+=2) fun(1,1); for(int i=1;i<m;i++) s[cor++]='R'; } else{ for(int i=1;i<m;i+=2) fun(1,0); for(int i=1;i<n;i++) s[cor++]='D'; } s[n*m-1]='\0'; printf("%s\n",s); } else{ printf("%d\n",sum-Min); int flag=0; for(int i=1;i<n;i+=2){ if(x==i) { out(1,y);flag=1; if(i+2<n) s[cor++]='D'; } else if(x==i+1) { out(2,y);flag=1; if(i+2<n) s[cor++]='D'; } else if(flag) fun(0,1); else fun(1,1); } s[n*m-2]='\0'; printf("%s\n",s); } } return 0; }
相关文章推荐
- 2015年最新Scala语言视频教程
- 二维几何模板 - 二维几何基础
- Mac OS下安装Brew
- HDU 1405 第六周 J题
- C#中yield return用法分析
- 修复系统时,鼠标键盘不能使用
- Objective-C 学习笔记 5 循环结构
- Win10正式版如何把小娜搜索换成谷歌搜索?
- 单向链表逆转
- update与case when的结合使用
- HOG特征经典分析汇总
- HDU-1102 Constructing Roads(最小生成树[Prim])
- Linux下fork()、vfork()、clone()和exec()的区别
- Android adb命令启动系统组件
- 【原】一句话说明Class.forName(xxx.xxx...)是干什么的
- 二维线段树(单点更新)
- Excel 用row()函数 在Excel中自动添加序号,
- LA 3135 Argus (优先队列的简单应用)
- Spring Quartz 框架结构概述
- OC中数组的四种遍历方式