开始时候有点怕, 感觉什么也不会,不过静下来思考思考也就想出来了,一个简单的BFS即可,但是由于队列没有重判,一直爆队列(MLE!)下次一定要注意!
(bfs第一次到达便最优?)
#include<queue>
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
int a[52][52];
bool mark[52][52][5]; //三个状态的重判
struct xy
{
int x,y;
int chaoxiang;
int count;
};
int minconmand;
int n,m;
void bfs(xy from,xy last) //如果不判重!必然爆队列!
{
queue<xy>q;
q.push(from);
mark[from.x][from.y][from.chaoxiang]=1;
while(!q.empty())
{
xy cur=q.front();
q.pop();
if(cur.x==last.x&&cur.y==last.y)
{
if(cur.count<minconmand)minconmand=cur.count;
// cout<<minconmand<<endl;
return ;
}
else
{
xy next(cur);
next.count++;
if(next.count>=minconmand)continue;
next.chaoxiang=((next.chaoxiang+1==5)?1:(next.chaoxiang+1));
if(mark[next.x][next.y][next.chaoxiang]==0)
q.push(next);
mark[next.x][next.y][next.chaoxiang]=1;
next=cur;
next.count++;
next.chaoxiang=((cur.chaoxiang-1==0)?4:(cur.chaoxiang-1));
if(mark[next.x][next.y][next.chaoxiang]==0)
q.push(next);
mark[next.x][next.y][next.chaoxiang]=1;
next=cur;
next.count++;
if(next.chaoxiang==1)
{
for(int i=1;i<=3;i++)
{
next.x-=1;
if(next.y>=n||next.y<=0||next.x<=0||next.x>=m)continue;
if(a[next.x-1][next.y]==1||a[next.x-1][next.y-1]==1)break;
if(mark[next.x][next.y][next.chaoxiang]==0)
q.push(next);
mark[next.x][next.y][next.chaoxiang]=1;
}
}
else if(next.chaoxiang==2)
{
for(int i=1;i<=3;i++)
{
next.y-=1;
if(next.y>=n||next.y<=0||next.x<=0||next.x>=m)continue;
if(a[next.x][next.y-1]==1||a[next.x-1][next.y-1]==1)break;
if(mark[next.x][next.y][next.chaoxiang]==0)
q.push(next);
mark[next.x][next.y][next.chaoxiang]=1;
}
}
else if(next.chaoxiang==3)
{
for(int i=1;i<=3;i++)
{
next.x+=1;
if(next.y>=n||next.y<=0||next.x<=0||next.x>=m)continue;
if(a[next.x][next.y]==1||a[next.x][next.y-1]==1)break;
if(mark[next.x][next.y][next.chaoxiang]==0)
q.push(next);
mark[next.x][next.y][next.chaoxiang]=1;
}
}
else if(next.chaoxiang==4)
{
for(int i=1;i<=3;i++)
{
next.y+=1;
if(next.y>=n||next.y<=0||next.x<=0||next.x>=m)continue;
if(a[next.x][next.y]==1||a[next.x-1][next.y]==1)break;
if(mark[next.x][next.y][next.chaoxiang]==0)
q.push(next);
mark[next.x][next.y][next.chaoxiang]=1;
}
}
}
}
return;
}
int main()
{
while(cin>>m>>n&&(n||m))
{
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
memset(mark,0,sizeof(mark));
xy from,last;
string chaoxiang;
cin>>from.x>>from.y;
cin>>last.x>>last.y;
cin>>chaoxiang;
from.count=0;
if(chaoxiang=="south")from.chaoxiang=3;
else if(chaoxiang=="north")from.chaoxiang=1;
else if(chaoxiang=="west")from.chaoxiang=2;
else if(chaoxiang=="east")from.chaoxiang=4;
minconmand=1000000;
bfs(from,last);
if(minconmand==1000000)cout<<-1<<endl;
else cout<<minconmand<<endl;
}
}