• DFS:Tempter of the Bone (规定时间达到规定地点)


    解题心得:
    1、注意审题,此题是在规定的时间达到规定的地点,不能早到也不能晚到。并不是最简单的dfs
    2、在规定时间达到规定的地点有几个剪枝:
    一、公式:所需的步骤 - x相差行 - y相差列 = 偶数。(这个解释很简单,无论怎么走,都可以把走的总路程分解到x方向和y方向,哪怕反向走,走回来后的步骤+反向走的步骤也一定是偶数,假设运用正交分解走到了终点(上面公式),但是步骤没走够,可以以最终的目标点为起点任选两格来回走消耗步骤,但是减去正交分解的步数后若是奇数,那么在终点来回走将步数消耗完之后必然会走出去而不能停留在终点。)
    二、总的格数减去墙数一定大于等于所需的步骤
    三、当时间超出了所需的时间时要return,并且消除标记。

    题目:
    Tempter of the Bone

    Time Limit :1s
    Memory limit :32M
    Accepted Submit :305
    Total Submit :1026

    The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it up, the maze began to shake, and the doggie could feel the ground sinking. He realized that the bone was a trap, and he tried desperately to get out of this maze.

    The maze was a rectangle with sizes N by M. There was a door in the maze. At the beginning, the door was closed and it would open at the T-th second for a short period of time (less than 1 second). Therefore the doggie had to arrive at the door on exactly the T-th second. In every second, he could move one block to one of the upper, lower, left and right neighboring blocks. Once he entered a block, the ground of this block would start to sink and disappear in the next second. He could not stay at one block for more than one second, nor could he move into a visited block. Can the poor doggie survive? Please help him.

    Input

    The input consists of multiple test cases. The first line of each test case contains three integers N, M, and T (1 < N, M < 7; 0 < T < 50), which denote the sizes of the maze and the time at which the door will open, respectively. The next N lines give the maze layout, with each line containing M characters. A character is one of the following:

    ‘X’: a block of wall, which the doggie cannot enter;
    ‘S’: the start point of the doggie;
    ‘D’: the Door; or
    ‘.’: an empty block.

    The input is terminated with three 0’s. This test case is not to be processed.

    Output

    For each test case, print in one line “YES” if the doggie can survive, or “NO” otherwise.

    Sample Input
    4 4 5
    S.X.
    ..X.
    ..XD
    ….
    3 4 5
    S.X.
    ..X.
    S
    …D
    0 0 0

    Sample Output
    NO
    YES

    #include<stdio.h>
    #include<cstring>
    #include<iostream>
    using namespace std;
    char maps[10][10];
    int n,m,t,cnt//记录步骤;
    int use[10][10],dir[4][2]={0,1,0,-1,1,0,-1,0};
    bool flag//标记是否在规定的时间点找到目标;
    struct node
    {
        int x,y;
    }aim,now;//记录出口和启动点
    int abs(int num)
    {
        if(num < 0)
            return 0-num;
        else
            return num;
    }
    void dfs(int x,int y,int cnt)
    {
        int i,temp;
        if(x == aim.x && y == aim.y && t == cnt)
        {
            flag = true;
            printf("YES
    ");
            return;
        }
        temp = abs(t-cnt) - (aim.x - x) - (aim.y - y);//这很重要,一定要注意,在时间超出之后要return,。。。。哎!
        if(temp<0 || temp%2)
            return;
        if(x<0 || y<0 || x>=n || y>=m)
            return;
        for(i=0;i<4;i++)
        {
    
            if(use[x+dir[i][0]][y+dir[i][1]] != 1 && maps[x+dir[i][0]][y+dir[i][1]] != 'X')
            {
                use[x+dir[i][0]][y+dir[i][1]] = 1;
                dfs(x+dir[i][0],y+dir[i][1],cnt+1);
                if(flag)
                    return;
                use[x+dir[i][0]][y+dir[i][1]] = 0;
            }
        }
        return;
    }
    int main()
    {
        while(scanf("%d%d%d",&n,&m,&t)!=EOF)
        {
            int d = 0;;
            if(n == 0 && m == 0 && t == 0)
                break;
            cnt = 0;
            memset(use,0,sizeof(use));
            for(int i=0;i<n;i++)
                scanf("%s",maps[i]);
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<m;j++)
                {
                    if(maps[i][j] == 'D')
                    {
                        aim.x = i;
                        aim.y = j;
                    }
                    if(maps[i][j] == 'S')
                    {
                        now.x = i;
                        now.y = j;
                    }
                    if(maps[i][j] == 'X')
                        d++;
                }
            }
            if(m*n - d < t)
            {
                printf("NO
    ");
                continue;
            }
            flag = false;
            use[now.x][now.y] = 1;
            dfs(now.x,now.y,cnt);
            if(!flag)
                printf("NO
    ");
        }
    }
    
  • 相关阅读:
    C#中如何禁止WindowsMediaPlayer双击全屏显示
    .NET中的泛型概述
    c# Windows服务管理
    C:Program不是内部或外部命令,也不是可运行的程序或批处理文件。
    Wireshark教程之二:Wireshark捕获数据分析
    Wireshark教程之一:认识Wireshark界面
    利用windows服务实现整点报时功能
    在windows服务中使用定时器
    flickity:支持触摸滑动,响应迅速的幻灯片轮播插件
    无法定位 Local Database Runtime 安装。请验证 SQL Server Express 是否正确安装以及本地数据库运行时功能是否已启用。
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107384.html
Copyright © 2020-2023  润新知