zoukankan      html  css  js  c++  java
  • 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
    ");  
        } 
    }
  • 相关阅读:
    localhost/127.0.0.1:8080
    android要注意的小问题
    2016年度工作计划
    2016年度计划总结
    竞品分析的思路
    《竞品调研:抄也是一门学问》学习总结
    书籍名单
    2015年度计划-总结
    以前的博客
    和老板沟通学习记录
  • 原文地址:https://www.cnblogs.com/lqquan/p/3671870.html
Copyright © 2011-2022 走看看