zoukankan      html  css  js  c++  java
  • HDU 1010 Tempter of the Bone

    dfs+剪枝

    题意是说一仅仅狗要逃出迷宫,可是必须在某个时间点刚好到出口。


    開始裸了一个dfs,TLE。。

    。剪枝没有啥思路。本来想用bfs先判是否能到达,感觉不靠谱。


    然后看Discuss,了解了一个奇偶性剪枝。

       0 1 0 1 0 1 0 1 0
       1 0 1 0 1 0 1 0 1
       0 1 0 1 0 1 0 1 0
       1 0 1 0 1 0 1 0 1
       0 1 0 1 0 1 0 1 0
       1 0 1 0 1 0 1 0 1

    0->1 和 1->0 都是奇数

    0->0 和 1->1 都是偶数。


    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<queue>
    #include<algorithm>
    #include<map>
    #include<stack>
    #include<iostream>
    #include<list>
    #include<set>
    #include<vector>
    #include<cmath>
    
    #define INF 0x7fffffff
    #define eps 1e-8
    #define LL long long
    #define PI 3.141592654
    #define CLR(a,b) memset(a,b,sizeof(a))
    #define FOR(i,a,n) for(int i= a;i< n ;i++)
    #define debug puts("==fuck==")
    #define acfun std::ios::sync_with_stdio(false)
    
    #define SIZE 1000+10
    using namespace std;
    
    int xx[]={0,0,-1,1};
    int yy[]={-1,1,0,0};
    int n,m,T;
    char g[10][10];
    int endx,endy;
    bool vis[10][10];
    bool flag;
    void dfs(int x,int y,int t)
    {
        if(flag)return;
    
        int tmp=(T-t)-abs(endx-x)-abs(endy-y);
        if(tmp<0||tmp&1)return;
    
        if(g[x][y]=='D'&&t==T)
            flag=1;
        else
        {
            FOR(k,0,4)
            {
                int i=x+xx[k];
                int j=y+yy[k];
                if(i<0||j<0||i>=n||j>=m||g[i][j]=='X'||vis[i][j])
                    continue;
                vis[i][j]=1;
                dfs(i,j,t+1);
                vis[i][j]=0;
            }
        }
    }
    
    int main()
    {
        //freopen("test","w",stdout);
        while(~scanf("%d%d%d",&n,&m,&T))
        {
            if(!n&&!m&&!T)return 0;
            char str[11];
            int x=0,y=0;
            FOR(i,0,n)
            {
                scanf("%s",str);
                FOR(j,0,m)
                {
                    g[i][j]=str[j];
                    if(g[i][j]=='S')
                        x=i,y=j;
                    else if(g[i][j]=='D')
                        endx=i,endy=j;
                }
            }
            CLR(vis,0);
            flag=0;
            vis[x][y]=1;
            dfs(x,y,0);
            if(flag)puts("YES");
            else puts("NO");
        }
    }
    


  • 相关阅读:
    Zabbix触发器支持的函数说明
    Zabbix Trigger表达式实例
    Nginx 504 Gateway Time-out问题解决
    题外话:我想立刻辞职,然后闭关学习编程语言,我给自己3个月时间学习C语言!这样行的通吗
    Vim快捷键分类
    [转]运维工作解释
    Cobbler的Web管理和维护
    使用 Cobbler 自动化和管理系统安装
    NTP时间服务器
    自动化部署必备技能—搭建YUM仓库
  • 原文地址:https://www.cnblogs.com/yfceshi/p/7105826.html
Copyright © 2011-2022 走看看