zoukankan      html  css  js  c++  java
  • ZOJ 2110 Tempter of the Bone(DFS)

    点我看题目

    题意 : 一个N×M的迷宫,D是门的位置,门会在第T秒开启,而开启时间小于1秒,问能否在T秒的时候到达门的位置,如果能输出YES,否则NO。

    思路 :DFS一下就可以,不过要注意下一终止条件再判断一下时间,还有因为题目中要求走过的路要变成墙,所以每次走的时候要注意一下把路变成墙,但是如果你不走这条路了,要记得变回来。还有这个题必须剪枝,否则超时超到疯啊,DFS函数中那个剪枝不怎么好想,T-t代表的是在当前位置还需要T-t步路。而fabs(ex-x)+fabs(ey-y)指的是当前位置离终点最短还有着些步数,如果两者之差不小于0的话,T-t应该等于fabs(ex-x)+fabs(ey-y)+s,这个s,如果再扩展的话增加的长宽必定是偶数,所以奇数是不可达的

    #include <stdio.h>
    #include <math.h>
    #include <iostream>
    #include <string.h>
    
    using namespace std ;
    
    int N,M,T ;
    char mapp[9][9] ;
    int mp[9][9];
    int sx,sy ;
    int ex,ey ;
    bool flag ;
    int ans;
    int dire[4][2] = {{0,-1},{0,1},{1,0},{-1,0}} ;
    
    void DFS(int x,int y,int t)
    {
        if(x == ex && y == ey&&t==T)
        {
            flag = true ;
            return  ;
        }
        int temp = (T-t)-fabs(ex-x)-fabs(ey-y) ;
        if(temp < 0 || temp%2) return ;
        for(int i = 0 ; i < 4 ; i++)
        {
            int xx = x+dire[i][0] ;
            int yy = y+dire[i][1] ;
            if(xx >= 0 && xx < N && yy >= 0 && yy < M && mp[xx][yy])
            {
                mp[xx][yy] = 0 ;
                DFS(xx,yy,t+1) ;
                if(flag) return ;
                mp[xx][yy] = 1 ;
            }
        }
    }
    int main()
    {
        while(scanf("%d %d %d",&N,&M,&T)!=EOF)
        {
            getchar();
            if(N == 0 && M == 0 && T == 0) break ;
            memset(mp,0,sizeof(mp)) ;
            flag = false ;
            int wall = 0 ;
            for(int i = 0 ; i < N ; i++)
            {
                scanf("%s",mapp[i]);
                for(int j = 0 ; j < M ; j++)
                {
                    if(mapp[i][j] == 'S')
                        sx = i ,sy = j ;
                    else if(mapp[i][j] == 'D')
                    {
                        ex = i,ey = j ;
                        mp[i][j] = 1 ;
                    }
                    else if(mapp[i][j] == '.')
                        mp[i][j] = 1 ;
                    else wall ++ ;
                }
            }
            if(N*M-wall <= T)
            {
                printf("NO
    ") ;
                continue ;
            }
            mp[sx][sy] = 0 ;
            DFS(sx,sy,0) ;
            if(flag)
                printf("YES
    ") ;
            else printf("NO
    ") ;
        }
        return 0 ;
    }
    View Code
  • 相关阅读:
    Redis安装与配置
    Mysql主从复制
    MySQL的基本使用
    如何理解 python 里面的 for 循环
    我在创业公司的 “云原生” 之旅
    linux 安装 kafka
    数据库性能优化
    Shell 中各种括号的作用
    DNS 配置实例-正反解析-主从同步-分离解析
    DHCP 中继转发配置(ensp 实现)
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3627058.html
Copyright © 2011-2022 走看看