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\n");
        else printf("no\n");
    }
    return 0;
}

 

posted @ 2016-05-03 13:08  Fighting_Heart  阅读(122)  评论(0编辑  收藏  举报