HDU1728 逃离迷宫 DFS

HDU1728逃离迷宫

/*DFS +步长减枝
78MS	1600K
*/
#include <stdio.h>
#include <string.h>
#include <utility>//pair<>
#include <algorithm>
using namespace std;
const int MAX=1e2+5;
const int INF=0x3f3f3f3f;//无限大
char m[MAX][MAX];//记录地图
bool flag,vis[MAX][MAX];
int Max,M,N;//记录地图长度和最大转向
int nxt[4][2]={1,0,-1,0,0,1,0,-1};//移动
int cut[MAX][MAX];//步长剪枝
pair<int,int>s,e;
void DFS(int x,int y,int step,int r)
{
    if (flag||step>Max) return;
    if (x==e.first&&y==e.second)
    {
        flag=1;
        return;
    }
    for (int k=0;k<4;k++)
    {
        int tx=x,ty=y;
        tx+=nxt[k][0];
        ty+=nxt[k][1];
        if (tx<1||ty<1||tx>M||ty>N||vis[tx][ty]||m[tx][ty]=='*') continue;
        int Stp=step;
        if (k!=r) Stp++;
        if (cut[tx][ty]<Stp) continue;
        else cut[tx][ty]=Stp;
        vis[tx][ty]=1;
        DFS(tx,ty,Stp,k);
        vis[tx][ty]=0;
    }
}
int main ()
{
    int T;
    scanf ("%d",&T);
    while (T--)
    {
        memset(vis,0,sizeof(vis));
        memset(cut,INF,sizeof(cut));
        flag=0;
        scanf ("%d%d",&M,&N);
        for (int k=1;k<=M;k++)
        {
            getchar();
            for (int i=1;i<=N;i++)
                m[k][i]=getchar();
        }
        scanf ("%d%d%d%d%d",&Max,&s.second,&s.first,&e.second,&e.first);
        vis[s.first][s.second]=1;
        DFS(s.first,s.second,-1,-1);
        if (flag)
            printf ("yes\n");
        else printf ("no\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/nrtostp/article/details/80143930