zoukankan      html  css  js  c++  java
  • 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++之函数模板
    Boost库初见
    C++之异常处理
    C++之运行时类型识别RTTI
    Qt5.4静态编译方法
    Altium Designer极坐标布局方法
    PM2.5空气质量指数(AQI)是如何计算的
    emWin学习课堂
    uboot 下更改NAND的分区 fdisk
    gps 数据解析-NMEA 0183协议
  • 原文地址:https://www.cnblogs.com/GoldenFingers/p/9107384.html
Copyright © 2011-2022 走看看