• HDU1010 Tempter of the Bone dfs(奇偶减枝)


    直接搜索会超时,需要减枝(奇偶减枝)。

    #include<stdio.h>
    #include<string.h>
    int n,m,t;
    char map[7][7];
    int x0,y0,x1,y1;  
    int flag;    
    int abs(int a) 
    {
        a>0?:a=-a; 
        return a;
    }
    void dfs(int time,int x,int y)
    {
        int temp=time-(abs(x1-x)+abs(y1-y));
        if(temp<0||temp%2) return;//剩余时间-距离终点的最小步数 小于0(够不到终点)或者 为奇数(最多能到终点前一个位置)则返回 
        else if(time==0) 
        {
            if(x==x1&&y==y1)
                flag=1;
            else return;    
        }
        if(flag) return;
        if(x-1>=0&&map[x-1][y]!='X')
        {
            map[x-1][y]='X';  
            dfs(time-1,x-1,y);
            map[x-1][y]='.';                     
        }
        if(y-1>=0&&map[x][y-1]!='X')
        {
            map[x][y-1]='X';
            dfs(time-1,x,y-1);
            map[x][y-1]='.';    
        }
        if(x+1<n&&map[x+1][y]!='X')
        {
            map[x+1][y]='X';
            dfs(time-1,x+1,y);
            map[x+1][y]='.';                       
        }
        if(y+1<m&&map[x][y+1]!='X')
        {
            map[x][y+1]='X';
            dfs(time-1,x,y+1);
            map[x][y+1]='.';                       
        }
        return;
    }
    int main(void)
    {
        int count;
        while(scanf("%d%d%d",&n,&m,&t))   
        {
            if(n==0&&m==0&&t==0) break;
            flag=0;
            count=0;
            getchar();
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<m;j++)
                {
                    scanf("%c",&map[i][j]); 
                    if(map[i][j]=='S')
                    {
                        x0=i;
                        y0=j; 
                        map[i][j]='X';                 
                    }   
                    if(map[i][j]=='D')
                    {
                        x1=i;
                        y1=j; 
                        count++;                 
                    }    
                    if(map[i][j]=='.') count++;
                }
                getchar();
            }
            if(t>count||t<abs(x1-x0)+abs(y1-y0))
            {
                printf("NO
    ");
                continue;                            
            }
            dfs(t,x0,y0);
            if(flag) printf("YES
    ");
            else printf("NO
    ");  
        } 
    }
  • 相关阅读:
    初学网络编程
    Python模块(三)(正则,re,模块与包)
    Python模块(二)(序列化)
    idea2020.2安装与破解
    部署-jenkins发布项目到linux环境
    部署-jenkins发布项目到windows环境
    部署-jenkins与gitlab结合使用
    部署-docker推送镜像到远程仓库
    部署-gitlab克隆地址踩坑
    部署-docker安装jenkins
  • 原文地址:https://www.cnblogs.com/lqquan/p/3671870.html
Copyright © 2020-2023  润新知