【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");
    }
}

你可能感兴趣的:(大模拟)