zoukankan      html  css  js  c++  java
  • HDU 1010 Tempter of the Bone

    题目大意:给定你起点S,和终点D,问你是否能在 T 时刻恰好到达终点D。

    单词积累:doggie 小狗  be fascinated by 被……吸引

    题解:首先很容易将题目误解为T时刻之前到达,那么广搜无疑,但是要在T时刻刚好到达,就只能DFS了,以下是两个剪枝:

    1.地图方格数减去障碍数再减1小于T,则直接无解:因为无法在T时刻到达;
    2.奇偶剪枝:每一步走后,曼哈顿距离与所走步数之和与T的差值必定是偶数,否则剪枝。
    #include<iostream>
    #include<cmath>
    #include<cstring>
    using namespace std;
    
    int n,m,t,ex,ey;
    bool V[10][10],flag,ans;
    char map[10][10];
    
    void DFS(int i,int j,int step)
    {
        if(flag) return ;
        if(step>t) return ;    
        if(i<0||i>=n||j<0||j>=m) {return ;}
        if(map[i][j]=='D'&&step==t) {flag=ans=true; return ;}
        int temp=abs(i-ex)+abs(j-ey);
        temp=t-temp-step;
        if(temp&1) return ;
        if(!V[i-1][j]&&map[i-1][j]!='X') 
        {
            V[i-1][j]=true;
            DFS(i-1,j,step+1);
            V[i-1][j]=false;
        }
        if(!V[i+1][j]&&map[i+1][j]!='X') 
        {
            V[i+1][j]=true;
            DFS(i+1,j,step+1);
            V[i+1][j]=false;
        }
        if(!V[i][j-1]&&map[i][j-1]!='X') 
        {
            V[i][j-1]=true;
            DFS(i,j-1,step+1);
            V[i][j-1]=false;
        }
        if(!V[i][j+1]&&map[i][j+1]!='X') 
        {
            V[i][j+1]=true;
            DFS(i,j+1,step+1);
            V[i][j+1]=false;
        }
    }
    
    int main()
    {
        int i,j,x,y,k;
        while(cin>>m>>n>>t&&(m||n||t))
        {
            memset(V,false,sizeof(V));
            k=0;
            for(i=0;i<n;i++)
            {
                for(j=0;j<m;j++)
                {
                    cin>>map[i][j];
                    if(map[i][j]=='S')
                    {
                        x=i;y=j;
                        V[i][j]=true;
                    }
                    if(map[i][j]=='D')
                    {
                        ex=i;ey=j;
                    }
                    if(map[i][j]=='X')k++;
                }
            }
            ans=flag=false;
            if(n*m-k-1>=t) DFS(x,y,0);
            if(ans) cout<<"YES"<<endl;
            else cout<<"NO"<<endl;
        }
        return 0;
    }
  • 相关阅读:
    002-pythn基础-循环、编码
    001-python3 初识
    confluence6.x安装
    python+ffmpeg切割视频
    Elasticsearch6.x和Kibana6.x的安装
    django基础
    CDH的完全离线安装(ubuntu16)
    python之旅十【第十篇】paramiko模块
    解决 MariaDB无密码就可以登录的问题
    切割日志(mysql,nginx,php tomcat)使用logrotate
  • 原文地址:https://www.cnblogs.com/forever97/p/3542271.html
Copyright © 2011-2022 走看看