60分 第2—第6+第10
奇了怪了
ans+1还有40分,而且还是不一样的点
#include<bits/stdc++.h>
using namespace std;
int mp[55][55];
int ap[55][55];
int dis[55][55][5];
int ch[4][9]={
{0,0,0,0,0,0,0,0,0},
{0,-1,0,0,1,1,0,0,-1},
{0,-2,0,0,2,2,0,0,-2},
{0,-3,0,0,3,3,0,0,-3},
};
struct rb{
int x,y;
int di;//方向
int step;
};
queue <rb> q;
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
cin>>ap[i][j];
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
for(int k=1;k<=4;++k)
dis[i][j][k]=INT_MAX;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
if(ap[i][j]==1)
{
mp[i-1][j]=1;
mp[i][j-1]=1;
mp[i-1][j-1]=1;
mp[i][j]=1;
}
int sx,sy;
int ox,oy;char sdi;
cin>>sx>>sy>>ox>>oy;
cin>>sdi;
rb s;
if(sdi=='N'){s.di=1;}
else if(sdi=='E'){s.di=2;}
else if(sdi=='S'){s.di=3;}
else if(sdi=='W'){s.di=4;}
s.x=sx;s.y=sy;s.step=0;
dis[sx][sy][s.di]=0;
q.push(s);
while(!q.empty())
{
rb now;
now=q.front();q.pop();
if(dis[now.x][now.y][now.di+1]==INT_MAX)
{
rb nx=now;nx.di=now.di+1;nx.step++;
q.push(nx);dis[now.x][now.y][now.di+1]=nx.step;
}
if(dis[now.x][now.y][now.di-1]==INT_MAX)
{
rb nx=now;nx.di=now.di-1;nx.step++;
q.push(nx);dis[now.x][now.y][now.di-1]=nx.step;
}
for(int i=1;i<=3;++i)
{
rb nx=now;
nx.x=now.x+ch[i][now.di*2-1];
nx.y=now.y+ch[i][now.di*2];
nx.step++;
if(mp[nx.x][nx.y]==1)
break;
if(dis[nx.x][nx.y][nx.di]==INT_MAX)
{
dis[nx.x][nx.y][nx.di]=nx.step;
q.push(nx);
}
}
}
int ans=INT_MAX;
for(int i=1;i<=4;++i)
if(dis[ox][oy][i]<ans)
ans=dis[ox][oy][i];
if(ans==INT_MAX)
cout<<"-1";
else
cout<<ans;
return 0;
}