zoukankan      html  css  js  c++  java
  • luogu P1126 机器人搬重物

    题目描述

    机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径1.6米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个N*M的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:向前移动1步(Creep);向前移动2步(Walk);向前移动3步(Run);向左转(Left);向右转(Right)。每个指令所需要的时间为1秒。请你计算一下机器人完成任务所需的最少时间。

    输入输出格式

    输入格式:

    输入的第一行为两个正整数N,M(N,M<=50),下面N行是储藏室的构造,0表示无障碍,1表示有障碍,数字之间用一个空格隔开。接着一行有四个整数和一个大写字母,分别为起始点和目标点左上角网格的行与列,起始时的面对方向(东E,南S,西W,北N),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。

    输出格式:

    一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出-1。

    输入输出样例

    输入样例#1:
    9 10
    0 0 0 0 0 0 1 0 0 0
    0 0 0 0 0 0 0 0 1 0
    0 0 0 1 0 0 0 0 0 0
    0 0 1 0 0 0 0 0 0 0
    0 0 0 0 0 0 1 0 0 0
    0 0 0 0 0 1 0 0 0 0
    0 0 0 1 1 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0
    1 0 0 0 0 0 0 0 1 0
    7 2 2 7 S
    输出样例#1:
    12
    bfs,格化点
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<iostream>
    
    using namespace std;
    const int N = 55;
    
    struct node{
        int x,y,step;
        int to;
    }cur,nxt;
    queue<node>q;
    int a[N][N];
    int mp[N][N];
    int dx[4]={0,1,0,-1};
    int dy[4]={1,0,-1,0};
    bool v[N][N][5];
    int n,m,k,sx,sy,ex,ey;
    char ch;
    
    void bfs()
    {
        if(sx==ex&&sy==ey) 
        {
            printf("0
    ");
            return ;
        }
        cur.x=sx; 
        cur.y=sy;
        cur.step=0;
        switch(ch)
        {
            case 'E': cur.to=0;break;
            case 'S': cur.to=1;break;
            case 'W': cur.to=2;break;
            case 'N': cur.to=3;break;
        }
        q.push(cur);
        v[sx][sy][cur.to] = true;
        while(!q.empty())
        {
            cur = q.front() ;
            q.pop();
            k = cur.to;
            for(int i=1;i<=3;++i)
            {
                int xx=cur.x+i*dx[k];
                int yy=cur.y+i*dy[k];
                if(xx>1&&xx<n&&yy>1&&yy<m&&!mp[xx][yy])
                {
                    if(xx==ex&&yy==ey) 
                    {
                        printf("%d
    ",cur.step+1);
                        return;
                    }
                    if(!v[xx][yy][k])
                    {
                        v[xx][yy][k]=1;
                        nxt.x=xx; 
                        nxt.y=yy;
                        nxt.step=cur.step+1;
                        nxt.to = k;
                        q.push(nxt);
                    }          
                 }
                else break;
            }
            nxt.x = cur.x; 
            nxt.y = cur.y;
            nxt.step = cur.step+1;
            nxt.to = (cur.to+1)%4; 
            if(!v[nxt.x][nxt.y][nxt.to])
            {
                v[nxt.x][nxt.y][nxt.to] = true;
                q.push(nxt);
            }
            nxt.to = (cur.to-1+4)%4;
            if(!v[nxt.x][nxt.y][nxt.to])
            {
                v[nxt.x][nxt.y][nxt.to] = true;
                q.push(nxt);
            }
        }
        printf("-1
    ");        
    }
    
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
        scanf("%d",&a[i][j]);
        scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
        cin>>ch;         
        sx++; sy++; ex++; ey++;
        for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            if(a[i][j]==1)
            {
                 mp[i][j] = 1;
                 mp[i+1][j] = 1;
                 mp[i][j+1] = 1;
                 mp[i+1][j+1] = 1;
            }
        n++; 
        m++;
        bfs();
        return 0;
        
    }
  • 相关阅读:
    再说ASP.NET 缓存
    asp.net 动态加载的用户控件属性传id值问题
    关于四季学期数据库设计问题
    如何在IIS里对网站限速
    命名空间与程序集
    多GridView页面中使用AJAX的优化方法
    OutputCache cookies 问题
    速度优化之GZIP对jscss压缩
    canphp框架论坛成立www.canphp.com/bbs/index.php现在论坛内测中
    js selection对象使用方法
  • 原文地址:https://www.cnblogs.com/sssy/p/7045151.html
Copyright © 2011-2022 走看看