Tempter of the Bone

版权声明:本文为博主原创文章,未经允许不得转载

 

 

第一次写dfs的题目,看了很多题解,深搜+剪枝

奇偶剪枝:

从起始点到终点无论怎么走,总可以分为最短路以及多走的路,而多走的路又可以分成靠近最短路径以及远离最短路径两部分,且二者必是对称的,所以多走的路长度必是偶数

 

 

 

#include<stdio.h>
#include<string.h>
#include<math.h>

    int sx,sy,ex,ey;
    int m,n,t;
    int flag;
    int vis[10][10];
    char map[10][10];
    int dx[]={0,0,-1,1};
    int dy[]={-1,1,0,0};
void dfs(int x,int y,int sum)
{
        int xx,yy;
    if(flag==1)
    return;
    if(x==ex&&y==ey&&sum==t)
    {
        flag=1;
        return;
    }
        int middis=abs(ex-x)+abs(ey-y);
        if(middis>t-sum||(t-sum-middis)%2!=0)//奇偶剪枝
        return;
        for(int i=0;i<4;i++)
        {
            xx=x+dx[i];
            yy=y+dy[i];
            if(xx>=0&&xx<n&&yy>=0&&yy<m&&!vis[xx][yy]&&map[xx][yy]!='X')
            {
                vis[xx][yy]=1;
                dfs(xx,yy,sum+1);
                vis[xx][yy]=0;
            }
        }
 } 
 
int main()
{
    while(scanf("%d%d%d",&n,&m,&t)==3)
    {
        int num=0;
        if(n==0)
        break;
        for(int i=0;i<n;i++)
        {
            scanf("%s",&map[i]);
            for(int j=0;j<m;j++)
            {
                if(map[i][j]=='S')
                {
                sx=i;
                sy=j;
            }
                else if(map[i][j]=='D')
                {
                    ex=i;
                    ey=j;
                }
                else if(map[i][j]=='X')
                num++;
            }
        }
        if(n*m-num-1<t)
        {
        printf("NO\n");
        continue;
    }
        flag=0;
        memset(vis,0,sizeof(vis));
        vis[sx][sy]=1;
        dfs(sx,sy,0);
        if(flag)
        printf("YES\n");
        else
        printf("NO\n");
     } 
     return 0;
}
 

 

posted @ 2017-08-30 10:36  半盏流年&  阅读(141)  评论(0)    收藏  举报