hdu 1728 逃离迷宫

这题目跟之前的连连看还有hdu1072 都很像,就是路径受转弯次数的限制,这时vis[][]数组并非用来记录一个点是否已被访问过,而是记录经过该点的最少转弯次数,若经过该点存在更少的转弯次数的路径,则该点可以再次入队

看代码吧

#include<iostream>
#include<queue>
using namespace std;
char map[101][101];
int n,m,T,ei,ej,dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int vis[101][101];
struct node
{
    int x,y,di,turn;
};
node f;
void bfs()
{
    queue<node> Q;
    Q.push(f);
    vis[f.x][f.y]=0;
    while(!Q.empty())
    {
        node t=Q.front(),temp;
        Q.pop();
        for(int k=0;k<4;k++)
        {
            int i=dir[k][0]+t.x;
            int j=dir[k][1]+t.y;
            if(i>n||i<1||j>m||j<1||map[i][j]=='*') continue;
            if(t.di!=k&&t.di!=-1)
                temp.turn=t.turn+1;
            else temp.turn=t.turn;//方向相同或刚出发
            if(temp.turn>T) continue;
            if(i==ei&&j==ej) {cout<<"yes"<<endl; return ;}
            if(vis[i][j]>=temp.turn)
            {
                vis[i][j]=temp.turn;
              temp.x=i;temp.y=j;temp.di=k;
               Q.push(temp);
            }
        }
    }
    cout<<"no"<<endl;
}
int main()
{
    int cas;
    cin>>cas;
    while(cas--)
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
              cin>>map[i][j];
        cin>>T>>f.y>>f.x>>ej>>ei;//把行跟列调换回来了,题目的那种叙述很不习惯
        f.di=-1;
        f.turn=0;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                vis[i][j]=20;//也不需要初始化的很大,因为T本身最大也才10
        bfs();
    }
    return 0;
}
 
        
posted @   枕边梦  阅读(187)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示