• 输入空格hdu 1010 Tempter of the Bone


    时间紧张,先记一笔,后续优化与完善。

        题意:一个N*M的地图,走过的点不能再走,X为墙弗成走,能否从点S到点D恰好用时T。(1 < N, M < 7; 0 < T < 50)

        标题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010

        ——>>有点数典忘祖的感觉,寒假时用cin输入数据,轻松AC,后来渐渐改成了用scanf来输入,明天,这道坑爹的标题交了n次也是WA,取代了n种方式后发明,是输入的问题,料想是输入的地图有空格……输入和空格输入和空格输入和空格

        超时优化的思想:

        1、可走格子数少于T时,必定不ok;

        2、从格子A到格子B,无论怎么走,步数的奇偶性相同。

        用时很少的写法:

    #include <cstdio>
    #include <cmath>
    #include <iostream>
    
    using namespace std;
    
    char MAP[8][8];
    int N, M, T, s_x, s_y, d_x, d_y;
    int dx[] = {-1, 0, 1,  0};
    int dy[] = { 0, 1, 0, -1};
    
    bool ok;
    
    void dfs(int x, int y, int cur)
    {
        if(ok) return;
        int temp = T - cur - abs(d_x-x) - abs(d_y-y);
        if((temp < 0) || (temp % 2 == 1)) return;
        for(int i = 0; i < 4; i++)
        {
            int new_x = x + dx[i];
            int new_y = y + dy[i];
            if(new_x >= 0 && new_x < N && new_y >= 0 && new_y < M && MAP[new_x][new_y] != 'X')
            {
                if(new_x == d_x && new_y == d_y && cur+1 == T) ok = 1;
                else
                {
                    MAP[new_x][new_y] = 'X';
                    dfs(new_x, new_y, cur+1);
                    MAP[new_x][new_y] = '.';
                }
            }
        }
    }
    int main()
    {
        int i, j, sum;
        while(scanf("%d%d%d", &N, &M, &T) == 3)
        {
            if(N == 0 && M == 0 && T == 0) return 0;
            sum = 1;
            for(i = 0; i < N; i++)
            {
                //getchar();
                for(j = 0; j < M; j++)
                {
                    //MAP[i][j] = getchar();
                    //scanf("%c", &MAP[i][j]);
                    cin>>MAP[i][j];
                    if(MAP[i][j] == 'S')
                    {
                        s_x = i;
                        s_y = j;
                    }
                    else if(MAP[i][j] == 'D')
                    {
                        d_x = i;
                        d_y = j;
    
                    }
                    else if(MAP[i][j] == 'X') sum++;
                }
    
            }
            sum = N*M - sum;
            ok = 0;
            MAP[s_x][s_y] = 'X';
            if(T <= sum)
                dfs(s_x, s_y, 0);
            if(ok) printf("YES\n");
            else printf("NO\n");
        }
        return 0;
    }
        每日一道理
    有一首诗最为动人,那就是青春;有一段人生最美丽,那就是青春;有一道风景最为亮丽,那就是青春。青春,不要说已疲惫,也许你的幻想曾被现实无情毁灭,也许你的追求毫无结果,但你应该相信,没有寒风的洗礼,哪来万紫千红的春天,没有心的耕耘,哪有累累硕果?

        vis[][]数组写法:

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <cmath>
    
    using namespace std;
    
    const int maxn = 7 + 10;
    int dx[] = {-1, 1,  0, 0};
    int dy[] = { 0, 0, -1, 1};
    char MAP[maxn][maxn];
    bool ok, vis[maxn][maxn];
    int N, M, T, Dx, Dy;
    
    void dfs(int x, int y, int cur)
    {
        if(ok) return;
        if(cur == T)
        {
            if(x == Dx && y == Dy)
            {
                ok = 1;
                return;
            }
            else
                return;
        }
        int temp = T - cur - (Dx - x) - (Dy - y);
        if(temp < 0 || (temp&1)) return;
        for(int i = 0; i < 4; i++)
        {
            int newx = x + dx[i];
            int newy = y + dy[i];
            if(newx >= 0 && newx < N && newy >= 0 && newy < M && MAP[newx][newy] != 'X' && !vis[newx][newy])
            {
                vis[newx][newy] = 1;
                dfs(newx, newy, cur+1);
                vis[newx][newy] = 0;
            }
        }
    }
    
    int main()
    {
        int Sx, Sy, i, j;
        while(scanf("%d%d%d", &N, &M, &T) == 3)
        {
            if(!N && !M && !T) return 0;
            for(i = 0; i < N; i++)
            {
                for(j = 0; j < M; j++)
                {
                    cin>>MAP[i][j];
                    if(MAP[i][j] == 'S')
                    {
                        Sx = i;
                        Sy = j;
                    }
                    else if(MAP[i][j] == 'D')
                    {
                        Dx = i;
                        Dy = j;
                    }
                }
            }
            ok = 0;
            memset(vis, 0, sizeof(vis));
            vis[Sx][Sy] = 1;
            dfs(Sx, Sy, 0);
            if(ok)
                printf("YES\n");
            else
                printf("NO\n");
        }
        return 0;
    }

    文章结束给大家分享下程序员的一些笑话语录: 很多所谓的牛人也不过如此,离开了你,微软还是微软,Google还是Google,苹果还是苹果,暴雪还是暴雪,而这些牛人离开了公司,自己什么都不是。

    --------------------------------- 原创文章 By 输入和空格 ---------------------------------

  • 相关阅读:
    Python3 爬取验证代理
    Python每天学一点之Threading和queue
    Python每天学一点之argparse
    [安恒月赛]反序列化字符逃逸
    $AFO$
    洛谷$P3647 [APIO2014]$连珠线 换根$dp$
    线性基学习笔记
    $vjudge CSP-S$专题专练题解
    $POJ2942 Knights of the Round Table$ 图论
    $tarjan$简要学习笔记
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3095537.html
Copyright © 2020-2023  润新知