【HDOJ 5402】Travelling Salesman Problem

【HDOJ 5402】Travelling Salesman Problem

一开始以为是搜索 仔细画了画发现就一模拟

奇数行或奇数列的时候怎么走都能全走完

偶数行偶数列的时候就要挑了

. * . * . *

* . * . * .

. * . * . *

* . * . * .

以4*6为例(如上图

星号可以保证不取其中一个可遍历完全图 点好的话就会连带一些星号

所以绕过星号中的最小值 是最佳遍历方式 输入的时候找到最小值并记录下行列 遍历到改行前以 右走到头 下 左走到头 下 右走到头这种方式走 直到走到该行 以下右上右下(第奇数行) 或下左上左下(第偶数行)接着走 直到走到星星列 多向右/向左走一步 即绕过他 然后接着这样走 保证遍历完即可

注意如果星星在最后一行要特判 从倒二行就要开始走右下右的方式

总之就是各大模拟

代码有点冗长 凑合看

#include <iostream>
#include <cstdio>
#define INF 0x3f3f3f3f

using namespace std;

int mp[101][101];

int main()
{
    int i,j,n,m,mm,x,y,s,z;
    while(~scanf("%d %d",&n,&m))
    {
        mm = INF;
        s = 0;
        for(i = 1; i <= n; ++i)
        {
            for(j = 1; j <= m; ++j)
            {
                scanf("%d",&mp[i][j]);
                if(i&1)
                {
                    if((m-j)%2 == 0 && mm > mp[i][j])
                    {
                        mm = mp[i][j];
                        x = i;
                        y = j;
                    }
                }
                else
                {
                    if((j-1)%2 == 0 && mm > mp[i][j])
                    {
                        mm = mp[i][j];
                        x = i;
                        y = j;
                    }
                }
                s += mp[i][j];
            }
        }

        if(n&1)
        {
            printf("%d\n",s);
            for(i = n-1; i >= 0; --i)
            {
                for(j = 1; j < m; ++j)
                {
                    if(i&1)
                    {
                        putchar(‘L‘);
                    }else putchar(‘R‘);
                }
                if(i) putchar(‘D‘);
            }
            printf("\n");
            continue;
        }
        else if(m&1)
        {
            printf("%d\n",s);
            for(j = m-1; j >= 0; --j)
            {
                for(i = 1; i < n; ++i)
                {
                    if(j&1)
                    {
                        putchar(‘U‘);
                    }else putchar(‘D‘);
                }
                if(j) putchar(‘R‘);
            }
            printf("\n");
            continue;
        }

        printf("%d\n",s-mm);
        for(i = 1; i <= n; ++i)
        {
            if(i == x || (i == x-1 && x == n)) break;
            for(j = 1; j < m; ++j)
            {
                if(i&1)
                {
                    putchar(‘R‘);
                }else putchar(‘L‘);
            }
            if(i) putchar(‘D‘);
        }

        if(i&1)
        {
            for(j = 1; j < m; ++j)
            {
                if(j == y) break;
                if(j&1)
                    putchar(‘D‘);
                else putchar(‘U‘);

                putchar(‘R‘);
            }
            if(j != m)putchar(‘R‘);
            for(++j; j < m; ++j)
            {
                if(j&1)
                    putchar(‘U‘);
                else putchar(‘D‘);

                putchar(‘R‘);
            }
        }
        else
        {
            for(j = m; j > 1; --j)
            {
                if(j == y) break;
                if(j&1)
                    putchar(‘U‘);
                else putchar(‘D‘);

                putchar(‘L‘);
            }
            if(j != 1)putchar(‘L‘);
            for(--j; j > 1; --j)
            {
                if(j&1)
                    putchar(‘D‘);
                else putchar(‘U‘);

                putchar(‘L‘);
            }
        }
        if((i&1 && y != m) || (i%2 == 0 && y != 1)) putchar(‘D‘);
        if(i+1 < n) putchar(‘D‘);
        for(i += 2; i <= n; ++i)
        {
            for(j = 1; j < m; ++j)
            {
                if(i&1)
                {
                    putchar(‘L‘);
                }else putchar(‘R‘);
            }
            if(i != n) putchar(‘D‘);
        }
        printf("\n");
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-09 23:02:36

【HDOJ 5402】Travelling Salesman Problem的相关文章

【HDU 5402】Travelling Salesman Problem(构造)

被某题卡SB了,结果这题也没读好...以为每个格子可以有负数就当搜索做了,怎么想也搜不过去,后来发现每个格子是非负数,那么肯定就是构造题. 题解如下: 首先如果nn为奇数或者mm为奇数,那么显然可以遍历整个棋盘. 如果n,mn,m都为偶数,那么讲棋盘黑白染色,假设(1,1)(1,1)和(n,m)(n,m)都为黑色,那么这条路径中黑格个数比白格个数多11,而棋盘中黑白格子个数相同,所以必然有一个白格不会被经过,所以选择白格中权值最小的不经过. 构造方法是这样,首先RRRRDLLLLD这样的路径走到

【HDOJ 5371】 Hotaru&#39;s problem

[HDOJ 5371] Hotaru's problem Manacher算法+穷举/set Manacher算法一好文:http://blog.csdn.net/yzl_rex/article/details/7908259 套一个Manacher算出回文半径数组p之后 有两种方法 穷举法: 枚举-1的点(根据题意只必为偶数回文) 找在该点回文半径内与其相隔最远 并且回文半径等于他俩距离(即两点为中心的回文串相同) 的点 记录找到时的距离 不断枚举找最大值即为最大回文串长 串长/2*3即为答案

【HDOJ 1002】A + B Problem II

A + B Problem II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 238517    Accepted Submission(s): 45969 Problem Description I have a very simple problem for you. Given two integers A and B, you

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

构造 - HDU 5402 Travelling Salesman Problem

Travelling Salesman Problem Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5402 Mean: 现有一个n*m的迷宫,每一个格子都有一个非负整数,从迷宫的左上角(1,1)到迷宫的右下角(n,m),并且使得他走过的路径的整数之和最大,问最大和为多少以及他走的路径. analyse: 首先,因为每个格子都是非负整数,而且规定每个格子只能走一次,所以为了使和尽可能大,必定是走的格子数越多越好.这样我们就需

HDU 5402 Travelling Salesman Problem (模拟 有规律)

Travelling Salesman Problem Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 568    Accepted Submission(s): 200 Special Judge Problem Description Teacher Mai is in a maze with n rows and m colum

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

大致题意:n*m的非负数矩阵,从(1,1) 只能向四面走,一直走到(n,m)为终点,路径的权就是数的和,输出一条权值最大的路径方案 思路:由于这是非负数,要是有负数就是神题了,要是n,m中有一个是奇数,显然可以遍历,要是有一个偶数,可以画图发现,把图染成二分图后,(1,1)为黑色,总能有一种构造方式可以只绕过任何一个白色的点,然后再遍历其他点,而绕过黑色的点必然还要绕过两个白色点才能遍历全部点,这是画图发现的,所以找一个权值最小的白色点绕过就可以了, 题解给出了证明: 如果n,mn,m都为偶数,

【HDOJ 5652】 India and China Origins(并查集)

[HDOJ 5652] India and China Origins(并查集) India and China Origins Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 805    Accepted Submission(s): 272 Problem Description A long time ago there are

【HDOJ 4763】 Theme Section (KMP+strstr)

[HDOJ 4763] Theme Section Theme Section Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1999    Accepted Submission(s): 947 Problem Description It's time for music! A lot of popular musicians a