hdu1728: 逃离迷宫

hdu1728: http://acm.hdu.edu.cn/showproblem.php?pid=1728
题意:求最少转弯数,开始时方向不定,所以第一次算不成转弯
code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int q[150*600][2],d[150][150][4];
char v[150][150];
const int inf=1<<29;
int main()
{
    int i,j,m,n,x,y,u,w,nx,ny,x1,y1,x2,y2,k,t,front,rear,dir;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&m,&n);
        getchar();
        for(i=0;i<m;i++)
            gets(v[i]);
        scanf("%d%d%d%d%d",&k,&x1,&y1,&x2,&y2);
        if(v[y2-1][x2-1]=='*')
        {
            printf("no\n");
            continue;
        }
        for(i=0;i<m;i++)
            for(j=0;j<n;j++)
                for(int z=0;z<4;z++)
                    d[i][j][z]=inf;
        for(i=0;i<4;i++)
            d[y1-1][x1-1][i]=0;
        front=0;rear=0;
        u=(y1-1)*n+x1-1;
        q[rear++][0]=u;q[rear-1][1]=0;
        while(rear>front)
        {
            u=q[front++][0];dir=q[front-1][1];    //加一维存方向
            x=u/n;y=u%n;
            for(i=0;i<4;i++)                   //枚举4个方向
            {
                nx=x+dx[i];ny=y+dy[i];
                if(nx>=0&&nx<m&&ny>=0&&ny<n&&v[nx][ny]!='*')
                {
                    if(i==dir||front==1)
                    {
                        if(d[nx][ny][i]>d[x][y][dir])
                        {
                            d[nx][ny][i]=d[x][y][dir];
                            w=nx*n+ny;
                            q[rear++][0]=w;
                            q[rear-1][1]=i;
                        }
                    }
                    else 
                    {
                        if(d[nx][ny][i]>d[x][y][dir]+1)
                        {
                            d[nx][ny][i]=d[x][y][dir]+1;
                            w=nx*n+ny;
                            q[rear++][0]=w;
                            q[rear-1][1]=i;
                        }
                    }
                }
            }
        }
        int min=inf;
        for(i=0;i<4;i++)
            if(d[y2-1][x2-1][i]<min)
                min=d[y2-1][x2-1][i];
        if(min>k)
            printf("no\n");
        else
            printf("yes\n");
    }
}
/*
input:
2
5 5
...**
*.**.
.....
.....
*....
1 1 1 1 3
5 5
...**
*.**.
.....
.....
*....
2 1 1 1 3
output:
no
yes
*/

posted on 2012-07-26 12:02  acmer-jun  阅读(185)  评论(0编辑  收藏  举报

导航