• 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;
    }
  • 相关阅读:
    Roce ofed 环境搭建与测试
    Ubuntu 1804 搭建NFS服务器
    Redhat 8.0.0 安装与网络配置
    Centos 8.1 安装与网络配置
    SUSE 15.1 系统安装
    VSpare ESXi 7.0 基本使用(模板、iso、SRIOV)
    VSpare ESXi 7.0 服务器安装
    open SUSE leap 15.1 安装图解
    KVM虚拟机网卡连接网桥
    GitHub Action一键部署配置,值得拥有
  • 原文地址:https://www.cnblogs.com/forever97/p/3542271.html
Copyright © 2020-2023  润新知