【题目链接】click here~~
【题目大意】:走方格,从【1,1】到【n,m】,求中间过程得到的数字和最大,并且输出路径
【思路】:
如果n和m里面有一个是奇数那么全部走遍就好了。 否则要找一个最小的点不要,这个点的坐标要满足x+y是奇数 如果不是的话,舍弃该点一定会导致另外一个点也走不到。 然后找到这个点,暴力输出路径即可。
代码:
#include <bits/stdc++.h> using namespace std; const int N=105; typedef long long LL; LL mat[N][N]; LL n,m; LL x,y; void getmin(){ /// 在n,m有一个为偶数的情况下,必然要舍弃一个点,找到权值最小的那个点(坐标之和必须为奇数) x=1,y=2; for(int i=1; i<=n; ++i) for(int j=1; j<=m; ++j){ if(mat[i][j]<mat[x][y]&&(i+j)&1){ x=i; y=j; } } } int main(){ while(~scanf("%I64d%I64d",&n,&m)){ memset(mat,0,sizeof(mat)); LL sum=0; for(int i=1; i<=n; ++i){ for(int j=1; j<=m; ++j){ scanf("%I64d",&mat[i][j]); sum+=mat[i][j]; ///统计和 } } LL ans; if(n&1||m&1)/// 如果有一个奇数,则方格可以全部走完, { printf("%I64d\n",sum); if(n&1||(n&1&&m&1)){ for(int i=0; i<n; ++i){ for(int j=1; j<m; ++j){ if(i&1) printf("L"); else printf("R"); } if(i!=n-1)printf("D"); } puts(""); } else if(m&1&&n%2==0){ for(int i=0; i<m; ++i){ for(int j=1; j<n; ++j){ if(i&1) printf("U"); else printf("D"); } if(i!=m-1) printf("R"); } puts(""); } } else{ ///偶数的情况 getmin(); ///获取最小权值的那个点的坐标 ans=sum-mat[x][y]; printf("%I64d\n",ans); for (int i = 1; i <= n; i += 2){ if (x == i || x == i + 1) {///处理该点的路径 for (int j = 1; j < y; j++){ if (j & 1) printf("D"); else printf("U"); printf("R"); } if (y<m) printf("R"); for (int j = y + 1; j <= m; j++){ if (j & 1) printf("U"); else printf("D"); if (j < m) printf("R"); } if (i < n - 1) printf("D"); } else if (i < x){ ///该点之前的路径 for (int j = 1; j < m; j++) printf("R"); printf("D"); for (int j = 1; j < m; j++) printf("L"); printf("D"); } else { ///该点之后的路径 for (int j = 1; j < m; j++) printf("L"); printf("D"); for (int j = 1; j < m; j++) printf("R"); if (i < n - 1) printf("D"); } } puts(""); } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-13 16:50:53