• TLE: HDOJ 1010 Tempter of the Bone


    超时了,dfs写的是对的(通过了discuss中一块强大的数据)

    谁说TLE的代码没有用?
    # include <stdio.h>
    # include <string.h>
    
    
    typedef struct{
        int x, y;
    }Point;
    
    const Point d[4] = {{-1,0}, {0,1}, {0,-1}, {1,0}};
    
    int N, M, T, tot, ok;
    char m[8][8];
    
    int dfs(Point s, int dir);
    int can_move(Point s, int dir);
    void solve(Point s, Point e, int T);
    
    int main()
    {
        int i;
        char *p;
        Point s, e;
        
        freopen("in.txt", "r", stdin);
        freopen("out.txt", "w", stdout);
        
        while (1)
        {
            scanf("%d%d%d", &N, &M, &T);
            if (!N && !M && !T) break;
            
            memset(m, 0, sizeof(m));
            
            for ( i = 1; i <= N; ++i)
            {
                scanf("%s", m[i]+1);
                if ((p = strchr(m[i]+1, 'S')) != NULL) {s.x = i; s.y = p-m[i];}
                 if ((p = strchr(m[i]+1, 'D')) != NULL) {e.x = i; e.y = p-m[i];}
               }
               
               solve(s, e, T);
        }
        
        return 0;
    }
    
    
    int dfs(Point s, int dir)
    {
        int ddir, f;
        
        f = 0;
        ++tot;
        s.x = s.x + d[dir].x;
        s.y = s.y + d[dir].y;
        if (m[s.x][s.y] == 'D') f = 1;
        if (tot == T && f) return ok = 1;
        m[s.x][s.y] = 'L';
        for ( ddir = 0; ddir < 4; ++ddir)
        {
             if (ddir != 3-dir && can_move(s, ddir))
                dfs(s, ddir);
        }
        --tot;
        if (!f)m[s.x][s.y] = '.';
        else m[s.x][s.y] = 'D';
    }
    
    int can_move(Point s, int dir)
    {
        Point nx; 
        nx.x = s.x + d[dir].x;
        nx.y = s.y + d[dir].y;
        if (1 <= nx.x && nx.x <= N && 1 <= nx.y && nx.y <= M && (m[nx.x][nx.y] == '.' || m[nx.x][nx.y] == 'D'))
            return 1;       
           return 0;
    }
    
    void solve(Point s, Point e, int T)
    {
        int dir;
        
        if (T >= N*M) {printf("NO\n"); return ;}
        if (m[s.x][s.y] == 'D')
        {
            if (T == 0) printf("YES\n");
            else printf("NO\n");
            return ;
        }
        m[s.x][s.y] = 'L';
        for (ok = dir = 0; dir < 4; ++dir)
        {
               tot = 0;
            if (can_move(s, dir) && !ok)
            {
                dfs(s, dir);
            }
        }
        printf(ok==1 ? "YES\n":"NO\n");
    }
  • 相关阅读:
    css布局
    常用正则表达式
    读书笔记Hadoop实战1
    C++ IDE for Linux
    由计算机的锁是怎么实现的
    pthread
    转:C++反汇编揭秘2 – VC编译器的运行时错误检查(RTC)
    PyDev Python 开发的IDE
    转:C++反汇编揭秘1 一个简单的C++程序反汇编解析
    如何查找命令对应的软件包
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2442083.html
Copyright © 2020-2023  润新知