这是第一次写题解。。。
选的真的道题有坑。。。
请认真读题。
此题来自洛谷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。
样例
INPUT
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
输出
12
题解
请认真读题。。被卡好长时间了。。
bfs 代码能力判断麻烦
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int n,m,i,j,x1,x2,y1,y2,k;
char dt;
int map[51][51][5];//1-n,2-s,3-e,4-w
struct loc{
int x,y,time;
char s;
};
loc Newloc(int x,int y,char s,int time){
loc temp;
temp.x=x;
temp.y=y;
temp.s=s;
temp.time=time;
return temp;
}
bool bfs();
int main(){
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++){
scanf("%d",&k);
if(k){
map[i][j][0]=map[i][j][1]=map[i][j][2]=map[i][j][3]=map[i][j][4]=2;
map[i-1][j][0]=map[i-1][j][1]=map[i-1][j][2]=map[i-1][j][3]=map[i-1][j][4]=2;
map[i-1][j-1][0]=map[i-1][j-1][1]=map[i-1][j-1][2]=map[i-1][j-1][3]=map[i-1][j-1][4]=2;
map[i][j-1][0]=map[i][j-1][1]=map[i][j-1][2]=map[i][j-1][3]=map[i][j-1][4]=2;
}
}
//for(i=1;i<=m;i++) map[1][i][0]=map[1][i][1]=map[1][i][2]=map[1][i][3]=map[1][i][4]=2;
for(i=1;i<=m;i++) map[n][i][0]=map[n][i][1]=map[n][i][2]=map[n][i][3]=map[n][i][4]=2;
//for(i=1;i<=n;i++) map[i][1][0]=map[i][1][1]=map[i][1][2]=map[i][1][3]=map[i][1][4]=2;
for(i=1;i<=n;i++) map[i][m][0]=map[i][m][1]=map[i][m][2]=map[i][m][3]=map[i][m][4]=2;
cin>>x1>>y1>>x2>>y2>>dt;
if(!bfs())cout<<"-1";
return 0;
}
bool bfs(){
queue<loc>q;
if(!map[x1][y1][0])
q.push(Newloc(x1,y1,dt,0));
map[x1][y1][0]=1;
switch(dt){
case'N':
map[x1][y1][1]=1;
break;
case'S':
map[x1][y1][2]=1;
break;
case'E':
map[x1][y1][3]=1;
break;
case'W':
map[x1][y1][4]=1;
break;
}
while(!q.empty()){
loc now=q.front();
q.pop();
int a=now.x;
int b=now.y;
int t=now.time;
if(a==x2&&b==y2){
cout<<t;
return true;
}
if(now.s=='N'){
if(!map[a-3][b][0]&&map[a-2][b][0]!=2&&map[a-1][b][0]!=2&&a-3>=1){
q.push(Newloc(a-3,b,'N',t+1));
map[a-3][b][0]=map[a-3][b][1]=1;
}
if(!map[a-2][b][0]&&map[a-1][b][0]!=2&&a-2>=1){
q.push(Newloc(a-2,b,'N',t+1));
map[a-2][b][0]=map[a-2][b][1]=1;
}
if(!map[a-1][b][0]&&a-1>=1){
q.push(Newloc(a-1,b,'N',t+1));
map[a-1][b][0]=map[a-1][b][1]=1;
}
if(!map[a][b][3]){
q.push(Newloc(a,b,'E',t+1));
map[a][b][3]=1;
}
if(!map[a][b][4]){
q.push(Newloc(a,b,'W',t+1));
map[a][b][4]=1;
}
}
if(now.s=='S'){
if(!map[a+3][b][0]&&map[a+2][b][0]!=2&&map[a+1][b][0]!=2&&a+3<=n){
q.push(Newloc(a+3,b,'S',t+1));
map[a+3][b][0]=map[a+3][b][2]=1;
}
if(!map[a+2][b][0]&&map[a+1][b][0]!=2&&a+2<=n){
q.push(Newloc(a+2,b,'S',t+1));
map[a+2][b][0]=map[a+2][b][2]=1;
}
if(!map[a+1][b][0]&&a+1<=n){
q.push(Newloc(a+1,b,'S',t+1));
map[a+1][b][0]=map[a+1][b][2]=1;
}
if(!map[a][b][3]){
q.push(Newloc(a,b,'E',t+1));
map[a][b][3]=1;
}
if(!map[a][b][4]){
q.push(Newloc(a,b,'W',t+1));
map[a][b][4]=1;
}
}
if(now.s=='W'){
if(!map[a][b-3][0]&&map[a][b-2][0]!=2&&map[a][b-1][0]!=2&&b-3>=1){
q.push(Newloc(a,b-3,'W',t+1));
map[a][b-2][0]=map[a][b-3][4]=1;
}
if(!map[a][b-2][0]&&map[a][b-1][0]!=2&&b-2>=1){
q.push(Newloc(a,b-2,'W',t+1));
map[a][b-2][0]=map[a][b-2][4]=1;
}
if(!map[a][b-1][0]&&b-1>=1){
q.push(Newloc(a,b-1,'W',t+1));
map[a][b-1][0]=map[a][b-1][4]=1;
}
if(!map[a][b][1]){
q.push(Newloc(a,b,'N',t+1));
map[a][b][1]=1;
}
if(!map[a][b][2]){
q.push(Newloc(a,b,'S',t+1));
map[a][b][2]=1;
}
}
if(now.s=='E'){
if(!map[a][b+3][0]&&map[a][b+2][0]!=2&&map[a][b+1][0]!=2&&b+3<=n){
q.push(Newloc(a,b+3,'E',t+1));
map[a][b+3][0]=map[a][b+3][3]=1;
}
if(!map[a][b+2][0]&&map[a][b+1][0]!=2&&b+2<=n){
q.push(Newloc(a,b+2,'E',t+1));
map[a][b+2][0]=map[a][b+2][3]=1;
}
if(!map[a][b+1][0]&&b+1<=n){
q.push(Newloc(a,b+1,'E',t+1));
map[a][b+1][0]=map[a][b+1][3]=1;
}
if(!map[a][b][1]){
q.push(Newloc(a,b,'N',t+1));
map[a][b][1]=1;
}
if(!map[a][b][2]){
q.push(Newloc(a,b,'S',t+1));
map[a][b][2]=1;
}
}
}
return false;
}