P1126 机器人搬重物

138 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 10 天,点击查看活动详情

题目:机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径1.6米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个 N×M 的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:向前移动1步(Creep);向前移动2步(Walk);向前移动3 步(Run);向左转(Left);向右转(Right)。每个指令所需要的时间为1 秒。请你计算一下机器人完成任务所需的最少时间。
思路:坑点很多很智障的一道题(题目和我都很智障),需要注意的点是机器人只能走格子的点,边界不能走,一个障碍可以使得a[i][j],a[i-1][j],a[j][j-1],a[i-1][j-1]四个点都不能走,别的根据条件来广搜就可以,因为一个莫名其妙的地方卡了半天

#include<bits/stdc++.h>
//#pragma-GCC-optimize("-Ofast");
#define ll long long
#define int long long
#define lowbit(x) ((x)&(-x))
#define endl '\n'
using namespace std;
const ll mod=998244353;
const ll inf=1e9;
const double pi=acos(-1);
const int N=1e6+100;
ll qpow(ll a,ll b)
{
    ll res=1;
    while(b)
    {
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res;
}
ll getinv(ll a){return qpow(a,mod-2);}
int n,m,a[55][55],r[55][55],f[55][55][4],vis[55][55][4],sx,sy,ex,ey,sd,ans;
map<char,int>mp;
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0},t[4]={0,1,3};
//不能用二维的,一用就错,不知道为啥
int dir[4][2]={{0,-1},{1,0},{0,1},{-1,0}};
struct node{
    int x,y,d,cnt;
};
void bfs(){
    queue<node>q;
    q.push(node{sx,sy,sd,0});
    while(!q.empty()){
        node u=q.front();q.pop();
        //cout<<"ux="<<u.x<<" uy="<<u.y<<" ucnt="<<u.cnt<<" ud="<<u.d<<" ans="<<ans<<endl;
        if(u.x==ex&&u.y==ey){ans=min(ans,u.cnt);continue;}

        if(vis[u.x][u.y][u.d]) continue;
        vis[u.x][u.y][u.d]=1;
        for(int i=0;i<3;i++){
            if(vis[u.x][u.y][(u.d+t[i])%4]==0) q.push(node{u.x,u.y,(u.d+t[i])%4,u.cnt+1});
            int tmp=2;
            if(i==0) tmp=1;
            int tx=u.x;
            int ty=u.y;
            int td=(u.d+t[i])%4;
            int flag=0;
            for(int j=1;j<=3;j++){
                tx+=dx[td];ty+=dy[td];
                //tx+=dir[td][0];ty+=dir[td][1];
                //cout<<dir[td][0]<<" "<<dir[td][1]<<" td="<<td<<endl;
                if(tx>=n||tx<1||ty<1||ty>=m) break;
                if(vis[tx][ty][td]||a[tx][ty]) break;
                q.push(node{tx,ty,td,u.cnt+tmp});
            }
        }
    }
    if(ans==inf) cout<<"-1\n";
    else cout<<ans<<endl;
}
signed main()
{
    //ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            cin>>r[i][j];
            if(r[i][j]){a[i][j]=a[i][j-1]=a[i-1][j]=a[i-1][j-1]=1;}
        }
    char d;ans=inf;
    mp['E']=0;mp['S']=1;mp['W']=2;mp['N']=3;
    cin>>sx>>sy>>ex>>ey>>d;sd=mp[d];
    memset(vis,0,sizeof(vis));
    bfs();
    return 0;
}