程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU 1728 逃離迷宮

HDU 1728 逃離迷宮

編輯:C++入門知識

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

ans[ i ][ j ][ k ][ d ] 標記是否以 轉彎k次且方向為d 的狀態走過。

被學弟蔑視的一道題竟然沒能1A,老啦。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#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 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\n");
            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\n");
    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;
//    }
//};
//

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved