zoukankan      html  css  js  c++  java
  • HDU 1728 逃离迷宫

    y行x列。傻傻分不清楚。

    ans[ i ][ j ][ k ][ d ] 标记是否以 转弯k次且方向为d 的状态走过。

    被学弟蔑视的一道题居然没能1A,老啦。

    #include <iostream>
    #include <algorithm>
    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    #include <cmath>
    #include <stack>
    #include <map>
    
    #pragma comment(linker, "/STACK:1024000000");
    #define EPS (1e-8)
    #define LL long long
    #define ULL unsigned long long int
    #define _LL __int64
    #define _INF 0x3f3f3f3f
    #define Mod 1000000007
    #define LM(a,b) (((ULL)(a))<<(b))
    #define RM(a,b) (((ULL)(a))>>(b))
    
    using namespace std;
    
    char Map[110][110];
    
    bool ans[110][110][11][4];
    
    struct Q
    {
        int x,y,d,ans;
    };
    
    int jx[] = {-1, 0, 1, 0};
    int jy[] = { 0,-1, 0, 1};
    
    void bfs(int n,int m)
    {
        int sx,sy,ex,ey,k;
    
        scanf("%d %d %d %d %d",&k,&sy,&sx,&ey,&ex);
    
        queue<Q> q;
        Q f,t;
        f.x = sx;
        f.y = sy;
        f.d = -1;
        f.ans = -1;
    
        q.push(f);
    
        while(q.empty() == false)
        {
            f = q.front();
            q.pop();
    
            if(f.x == ex && f.y == ey)
            {
                printf("yes
    ");
                return ;
            }
    
            for(int i = 0;i < 4; ++i)
            {
                t.x = f.x + jx[i];
                t.y = f.y + jy[i];
                t.d = i;
                if(f.d == i)
                    t.ans = f.ans;
                else
                    t.ans = f.ans+1;
    
                if(1 <= t.x && t.x <= n && 1 <= t.y && t.y <= m && t.ans <= k && '.' == Map[t.x][t.y] && ans[t.x][t.y][t.ans][t.d] == false)
                {
                    ans[t.x][t.y][t.ans][t.d] = true;
                    q.push(t);
                }
            }
    
        }
        printf("no
    ");
        return ;
    }
    
    int main()
    {
        int T;
    
        scanf("%d",&T);
    
        int n,m,i;
    
        while(T--)
        {
            scanf("%d %d",&n,&m);
    
            memset(ans,false,sizeof(ans));
    
            for(i = 1;i <= n; ++i)
                scanf("%*c%s",Map[i]+1);
    
            bfs(n,m);
    
        }
    }
    
    //const int MAXN = 1000010;
    //
    //struct Edge
    //{
    //    int u,v,w,next;
    //} edge[MAXN*2];
    //
    //int head[MAXN];
    //
    //int Top;
    //
    //void Link(int u,int v,int w = -1)
    //{
    //    edge[Top].u = u;
    //    edge[Top].v = v;
    //    edge[Top].w = w;
    //    edge[Top].next = head[u];
    //    head[u] = Top++;
    //}
    //
    //void Init(int n)
    //{
    //    Top = 0;
    //    memset(head,-1,sizeof(int)*(n+2));
    //}
    //
    //struct Q
    //{
    //    int v,w;
    //
    //    bool operator < (const Q &a) const
    //    {
    //        return w < a.w;
    //    }
    //};
    //
    

  • 相关阅读:
    对ManualResetEvent和AutoResetEvent的巩固练习
    经纬度点距离的那点儿事
    【读书笔记】C++Primer---第三章
    .NET应用程序调试—原理、工具、方法
    【读书笔记】C++Primer---第二章
    【读书笔记】C++Primer---第一章
    8 个最好的 jQuery 树形 Tree 插件
    C++中引用(&)的用法和应用实例
    自娱自乐之直接插入排序
    自娱自乐之堆排序
  • 原文地址:https://www.cnblogs.com/blfbuaa/p/6898415.html
Copyright © 2011-2022 走看看