Patrol Robot 广搜

题目链接放这里

UVA_1600 Patrol Robot


深搜dfs和广搜bfs都可以

广搜又可以分两种方式,一种是基本的搜到就break跳出,

另一种是不断更新一个地图(更新每个点最小的到达步数)

这里我用的是第二种,看到很多人开的三维数组,我觉得没有必要(当然是对于我这种解法来说)

并没有开,只是开了个对于每个压入队列的结构体多开了个障碍物变量


代码


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int mmp[124][124];//步数的统计地图
int vis[124][124];//原本的含墙地图
int dir[5][2]={
1,0, -1,0, 0,-1, 0,1
};

struct D
{
    int x,y,indx,Obstacle;
}p;

queue<D> Q;

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m,k;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&vis[i][j]),mmp[i][j]=0x3f3f3f3f;

        mmp[1][1]=0;

        p.x=p.y=1,p.indx = 0,p.Obstacle = vis[1][1];

        Q.push(p);

        while(!Q.empty())
        {
            p = Q.front();
            Q.pop();
            for(int i=0;i<4;i++)
            {
                int tx = p.x + dir[i][0];
                int ty = p.y + dir[i][1];
                if(tx>0 && ty>0 && tx<=n && ty<=m)
                {
                    D c;
                    c.indx = p.indx+1;
                    c.x = tx , c.y = ty;

                    if(vis[tx][ty])
                        c.Obstacle = p.Obstacle +1;//连续穿墙
                    else
                        c.Obstacle = 0;//走出墙,自然清零

                    if( mmp[tx][ty]>=c.indx && c.Obstacle<=k )//更新当前点的条件是当前走的步数小于等于之前存的步数,注意等于也是要更新的,原因是---等于的话走或不走对当前点的步数并没有影响,但是走了当前点可能对之后点的更新产生影响,所以要更新
                    {
                        mmp[tx][ty]=c.indx;
                        Q.push(c);
                    }
                }
            }
        }
        if(mmp[n][m]!=0x3f3f3f3f)
            printf("%d\n",mmp[n][m]);
        else
            printf("-1\n");
    }

    return 0;
}




猜你喜欢

转载自blog.csdn.net/du_mingm/article/details/80628006