zoukankan      html  css  js  c++  java
  • HDU 1010:(DFS)

    需要在确切的时间到达D处

    此题特殊的地方在于剪枝方法:根据所处点与D处的曼哈顿距离和所剩步数的奇偶性剪枝。如果两者奇偶性不同,直接return

    #include"cstdio"
    #include"cmath"
    #include"cstring"
    #include"iostream"
    #include"queue"
    #define MAXN 10
    using namespace std;
    int dx[4]={-1,1,0,0};
    int dy[4]={0,0,-1,1};
    int x,y,time,sx,sy,ex,ey,ok;
    int mat[MAXN][MAXN],vis[MAXN][MAXN];
    char arr[MAXN];
    void dfs(int i,int j,int step)
    {   if(ok) return;
        if(fabs(i-ex)+fabs(j-ey)>step||(step-(int)(fabs(i-ex)+fabs(j-ey)))%2) return ;
        if(i==ex&&j==ey&&!step) {ok=1;return;}
        if(!step) return;
        for(int k=0;k<=4;k++){
            if(i+dx[k]>=0&&i+dx[k]<x&&j+dy[k]>=0&&j+dy[k]<y&&mat[i+dx[k]][j+dy[k]]&&!vis[i+dx[k]][j+dy[k]]){
                vis[i+dx[k]][j+dy[k]]=1;
                dfs(i+dx[k],j+dy[k],step-1);
                vis[i+dx[k]][j+dy[k]]=0;
            }
        }
        return;
    }
    int main()
    {   while(scanf("%d%d%d",&x,&y,&time)&&(x||y||time)){
        memset(mat,0,sizeof(mat));
            for(int i=0;i<x;i++){
                scanf("%s",arr);
                for(int j=0;j<y;j++){
                    if(arr[j]=='S') {sx=i;sy=j;mat[i][j]=0;}
                    else if(arr[j]=='.') mat[i][j]=1;
                    else if(arr[j]=='X') mat[i][j]=0;
                    else {ex=i;ey=j;mat[i][j]=1;}
                }
            }
            memset(vis,0,sizeof(vis));
            ok=0;
            vis[sx][sy]=1;
            dfs(sx,sy,time);
            if(ok) printf("YES
    ");
            else printf("NO
    ");
        }
        return 0;
    }
    View Code
  • 相关阅读:
    python安装教程
    protobuf安装教程
    PlantUML安装教程
    题解-CF1140E Palindrome-less Arrays
    FST
    线段树
    题解-CF677D Vanya and Treasure
    最短路
    后缀自动机
    虚树
  • 原文地址:https://www.cnblogs.com/luxiaoming/p/4705266.html
Copyright © 2011-2022 走看看