题目来源:
题目描述:
题目描述
机器人移动学会(RMI
)现在正尝试用机器人搬运物品。机器人的形状是一个直径 $1.6 米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个 N \times MN×M 的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:向前移动 11步(Creep
);向前移动2步(Walk
);向前移动 33 步(Run
);向左转(Left
);向右转(Right
)。每个指令所需要的时间为 11 秒。请你计算一下机器人完成任务所需的最少时间。
输入输出格式
输入格式:第一行为两个正整数 N,M(N,M \le 50)N,M(N,M≤50) ,下面 NN 行是储藏室的构造, 00 表示无障碍, 11 表示有障碍,数字之间用一个空格隔开。接着一行有 44 个整数和 11 个大写字母,分别为起始点和目标点左上角网格的行与列,起始时的面对方向(东 EE ,南 SS ,西 WW ,北 NN ),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。
输出格式:一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出 -1−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
解题思路:
本题好像在poj上见过,关键是要考虑机器人的半径,不能当作一个点,而且对图的处理也很重要,可以把障碍物统一放在右上角也可以放在左上角,就是一定要统一,不然就会乱,还有就是在判重的时候要开个三维数组,因为还有方向要考虑,最后也是在搜索的时候分类讨论方向,前进1,2,3,都要考虑。。。
代码:
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
int tu[55][55];
struct newt{
int x,y,time;
char dir;
}dian;
int n,m;
void cl(int x,int y)
{
if(x-1>=1){
tu[x-1][y]=1;
}
if(y-1>=1){
tu[x][y-1]=1;
}
if(x-1>=1&&y-1>=1){
tu[x-1][y-1]=1;
}
return ;
}
priority_queue<newt>pq;
bool operator <(newt a,newt b)
{
return a.time>b.time;
}
bool jl[55][55][4];
bool pd(newt a)
{
if(a.x>=1&&a.x<n&&a.y>=1&&a.y<m&&!tu[a.x][a.y])
{
if(a.dir=='E'&&!jl[a.x][a.y][0])return 1;
if(a.dir=='W'&&!jl[a.x][a.y][1])return 1;
if(a.dir=='S'&&!jl[a.x][a.y][2])return 1;
if(a.dir=='N'&&!jl[a.x][a.y][3])return 1;
}
return 0;
}
int main()
{
memset(jl,0,sizeof(jl));
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&tu[i][j]);
if(tu[i][j]==1)cl(i,j);
}
int bx,by,ex,ey;
scanf("%d%d%d%d",&bx,&by,&ex,&ey);
char c;
cin>>c;
dian.x=bx;dian.y=by;
if(tu[bx][by]==1){
cout<<-1<<endl;
return 0;
}
if(bx==ex&&by==ey){
cout<<0<<endl;
return 0;
}
dian.time=0;
dian.dir=c;
pq.push(dian);
if(c=='E'){
jl[bx][by][0]=1;
}
else if(c=='W'){
jl[bx][by][1]=1;
}
else if(c=='S'){
jl[bx][by][2]=1;
}
else {
jl[bx][by][3]=1;
};
int flagg=0,tt=1000000;
while(!pq.empty())
{
newt now=pq.top();
if(now.x==ex&&now.y==ey){
flagg=1;
tt=now.time;
break;
}
pq.pop();
if(now.dir=='E'){
if(!jl[now.x][now.y][1])
{
newt nod=now;
nod.dir='W';
nod.time=now.time+2;
pq.push(nod);
jl[now.x][now.y][1]=1;
}
if(!jl[now.x][now.y][2])
{
newt nod=now;
nod.dir='S';
nod.time=now.time+1;
pq.push(nod);
jl[now.x][now.y][2]=1;
}
if(!jl[now.x][now.y][3])
{
newt nod=now;
nod.dir='N';
nod.time=now.time+1;
pq.push(nod);
jl[now.x][now.y][3]=1;
}
newt nod;
int flag=0,flag1=0;
nod.y=now.y+1;
nod.x=now.x;
nod.time=now.time+1;
nod.dir=now.dir;
if(pd(nod)){
pq.push(nod);
jl[nod.x][nod.y][0]=1;
flag=1;
}
nod.y=now.y+2;
if(pd(nod)&&flag)
{
pq.push(nod);
jl[nod.x][nod.y][0]=1;
flag1=1;
}
nod.y=now.y+3;
if(pd(nod)&&flag1)
{
pq.push(nod);
jl[nod.x][nod.y][0]=1;
}
}
else if(now.dir=='W'){
if(!jl[now.x][now.y][0])
{
newt nod=now;
nod.dir='E';
nod.time=now.time+2;
pq.push(nod);
jl[now.x][now.y][0]=1;
}
if(!jl[now.x][now.y][2])
{
newt nod=now;
nod.dir='S';
nod.time=now.time+1;
pq.push(nod);
jl[now.x][now.y][2]=1;
}
if(!jl[now.x][now.y][3])
{
newt nod=now;
nod.dir='N';
nod.time=now.time+1;
pq.push(nod);
jl[now.x][now.y][3]=1;
}
newt nod;
int flag=0,flag1=0;
nod.y=now.y-1;
nod.x=now.x;
nod.time=now.time+1;
nod.dir=now.dir;
if(pd(nod)){
pq.push(nod);
jl[nod.x][nod.y][1]=1;
flag=1;
}
nod.y=now.y-2;
if(pd(nod)&&flag)
{
pq.push(nod);
jl[nod.x][nod.y][1]=1;
flag1=1;
}
nod.y=now.y-3;
if(pd(nod)&&flag1)
{
pq.push(nod);
jl[nod.x][nod.y][1]=1;
}
}
else if(now.dir=='S'){
if(!jl[now.x][now.y][3])
{
newt nod=now;
nod.dir='N';
nod.time=now.time+2;
pq.push(nod);
jl[now.x][now.y][3]=1;
}
if(!jl[now.x][now.y][0])
{
newt nod=now;
nod.dir='E';
nod.time=now.time+1;
pq.push(nod);
jl[now.x][now.y][0]=1;
}
if(!jl[now.x][now.y][1])
{
newt nod=now;
nod.dir='W';
nod.time=now.time+1;
pq.push(nod);
jl[now.x][now.y][1]=1;
}
newt nod;
int flag=0,flag1=0;
nod.y=now.y;
nod.x=now.x+1;
nod.time=now.time+1;
nod.dir=now.dir;
if(pd(nod)){
pq.push(nod);
jl[nod.x][nod.y][2]=1;
flag=1;
}
nod.x=now.x+2;
if(pd(nod)&&flag)
{
pq.push(nod);
jl[nod.x][nod.y][2]=1;
flag1=1;
}
nod.x=now.x+3;
if(pd(nod)&&flag1)
{
pq.push(nod);
jl[nod.x][nod.y][2]=1;
}
}
else {
if(!jl[now.x][now.y][2])
{
newt nod=now;
nod.dir='S';
nod.time=now.time+2;
pq.push(nod);
jl[now.x][now.y][2]=1;
}
if(!jl[now.x][now.y][0])
{
newt nod=now;
nod.dir='E';
nod.time=now.time+1;
pq.push(nod);
jl[now.x][now.y][0]=1;
}
if(!jl[now.x][now.y][1])
{
newt nod=now;
nod.dir='W';
nod.time=now.time+1;
pq.push(nod);
jl[now.x][now.y][1]=1;
}
newt nod;
int flag=0,flag1=0;
nod.x=now.x-1;
nod.y=now.y;
nod.time=now.time+1;
nod.dir=now.dir;
if(pd(nod)){
pq.push(nod);
jl[nod.x][nod.y][3]=1;
flag=1;
}
nod.x=now.x-2;
if(pd(nod)&&flag)
{
pq.push(nod);
jl[nod.x][nod.y][3]=1;
flag1=1;
}
nod.x=now.x-3;
if(pd(nod)&&flag1)
{
pq.push(nod);
jl[nod.x][nod.y][3]=1;
}
}
}
if(flagg){
cout<<tt<<endl;
}
else cout<<-1<<endl;
return 0;
}