您的位置:首页 > 其它

HDU 5402 Travelling Salesman Problem (MUT#9 暴力模拟)

2015-08-20 11:01 106 查看
【题目链接】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

;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: