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

    简单搜索。记录一下到某个点,朝某个方向的最小转弯次数。

    #include<iostream>
    #include<string>
    #include<iomanip>
    #include<string.h>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    
    int INF=0x7FFFFFFF;
    const int maxn=100+5;
    int n,m;
    char s[maxn][maxn];
    int MIN[5][maxn][maxn];
    int X1,X2,Y1,Y2,K;
    
    int dir[4][2]={
        {0,1},
        {1,0},
        {0,-1},
        {-1,0}
    };
    int flag;
    
    bool P(int a,int b)
    {
        if(a>=0&&a<=n-1)
        {
            if(b>=0&&b<=m-1)
            {
                if(s[a][b]!='*')
                {
                    return 1;
                }
            }
        }
        return 0;
    }
    
    void dfs(int a,int b,int d,int tot)
    {
        if(tot>K) return;
        if(a==X2&&b==Y2)
        {
            flag=1;
            return;
        }
        for(int i=0;i<4;i++)
        {
            int x=a+dir[i][0];
            int y=b+dir[i][1];
    
            if(P(x,y)==0) continue;
    
            if(i==d)
            {
                if(tot<MIN[i][x][y])
                {
                    MIN[i][x][y]=tot;
                    dfs(x,y,i,tot);
                }
            }
    
            else
            {
                if(tot+1<MIN[i][x][y])
                {
                    MIN[i][x][y]=tot+1;
                    dfs(x,y,i,tot+1);
                }
            }
    
        }
    
    }
    
    int main()
    {
        int T; scanf("%d",&T);
        while(T--)
        {
            scanf("%d%d",&n,&m);
            for(int i=0;i<n;i++) scanf("%s",s[i]);
    
            for(int i=0;i<n;i++)
                for(int j=0;j<m;j++)
                {
                    MIN[0][i][j]=INF;
                    MIN[1][i][j]=INF;
                    MIN[2][i][j]=INF;
                    MIN[3][i][j]=INF;
                }
            scanf("%d%d%d%d%d",&K,&Y1,&X1,&Y2,&X2);
            X1--; Y1--; X2--; Y2--;
            
            flag=0;
            for(int i=0;i<4;i++)
            {
                MIN[i][X1][Y1]=0;
                dfs(X1,Y1,i,0);
                if(flag) break;
            }
            if(flag) printf("yes
    ");
            else printf("no
    ");
        }
        return 0;
    }
  • 相关阅读:
    Silverlight Control(五)TimePicker
    《ASP.NET Core 3框架揭秘》笔记
    Hyper-V初体验
    debian初体验
    异步编程-编程指南
    Oracle查询优化读书笔记
    设计原则
    日志管理
    Git在Vs中的使用
    SVN使用备注
  • 原文地址:https://www.cnblogs.com/zufezzt/p/5454625.html
Copyright © 2011-2022 走看看