一道折磨了我整整一天的bfs
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define MAXN 2000
using namespace std;
int P[MAXN][MAXN];
int G[MAXN][MAXN];
int vis[MAXN][MAXN];
int tim[MAXN][MAXN];
int N,M;
int SX,SY,EX,EY;
char opt;
struct item
{
int x;
int y;
char op;
};
queue<item>q;
bool sign;
void bfs(item t)
{
q.push(t);
while(!q.empty())
{
item r;
r=q.front();
q.pop();
//bool book=0;
//if(vis[r.x][r.y]!=0) continue;
if(r.op=='E')
{
if(tim[r.x][r.y+3]>=tim[r.x][r.y]+1&&G[r.x][r.y+3]==0&&r.y+3<=M)
{
//book=1;
tim[r.x][r.y+3]=min(tim[r.x][r.y+3],tim[r.x][r.y]+1);
vis[r.x][r.y+3]=1;
item t2;
t2.x=r.x;
t2.y=r.y+3;
t2.op='E';
q.push(t2);
}
if(tim[r.x][r.y+2]>=tim[r.x][r.y]+1&&G[r.x][r.y+2]==0&&r.y+2<=M)
{
//book=1;
tim[r.x][r.y+2]=min(tim[r.x][r.y+2],tim[r.x][r.y]+1);
vis[r.x][r.y+2]=1;
item t2;
t2.x=r.x;
t2.y=r.y+2;
t2.op='E';
q.push(t2);
}
if(tim[r.x][r.y+1]>=tim[r.x][r.y]+1&&G[r.x][r.y+1]==0&&r.y+1<=M)
{
//book=1;
tim[r.x][r.y+1]=min(tim[r.x][r.y+1],tim[r.x][r.y]+1);
vis[r.x][r.y+1]=1;
item t2;
t2.x=r.x;
t2.y=r.y+1;
t2.op='E';
q.push(t2);
}
if(tim[r.x+3][r.y]>=tim[r.x][r.y]+2&&G[r.x+3][r.y]==0&&r.x+3<=N)
{
//book=1;
tim[r.x+3][r.y]=min(tim[r.x+3][r.y],tim[r.x][r.y]+2);
vis[r.x+3][r.y]=1;
item t2;
t2.x=r.x+3;
t2.y=r.y;
t2.op='S';
q.push(t2);
}
if(tim[r.x+2][r.y]>=tim[r.x][r.y]+2&&G[r.x+2][r.y]==0&&r.x+2<=N )
{
//book=1;
tim[r.x+2][r.y]=min(tim[r.x+2][r.y],tim[r.x][r.y]+2);
vis[r.x+2][r.y]=1;
item t2;
t2.x=r.x+2;
t2.y=r.y;
t2.op='S';
q.push(t2);
}
if(tim[r.x+1][r.y]>=tim[r.x][r.y]+2&&G[r.x+1][r.y]==0&&r.x+1<=N )
{
//book=1;
tim[r.x+1][r.y]=min(tim[r.x+1][r.y],tim[r.x][r.y]+2);
vis[r.x+1][r.y]=1;
item t2;
t2.x=r.x+1;
t2.y=r.y;
t2.op='S';
q.push(t2);
}
if(tim[r.x-3][r.y]>=tim[r.x][r.y]+2&&G[r.x-3][r.y]==0&&r.x-3>=0)
{
//book=1;
tim[r.x-3][r.y]=min(tim[r.x-3][r.y],tim[r.x][r.y]+2);
vis[r.x-3][r.y]=1;
item t2;
t2.x=r.x-3;
t2.y=r.y;
t2.op='N';
q.push(t2);
}
if(tim[r.x-2][r.y]>=tim[r.x][r.y]+2&&G[r.x-2][r.y]==0&&r.x-2>=0)
{
//book=1;
tim[r.x-2][r.y]=min(tim[r.x-2][r.y],tim[r.x][r.y]+2);
vis[r.x-2][r.y]=1;
item t2;
t2.x=r.x-2;
t2.y=r.y;
t2.op='N';
q.push(t2);
}
if(tim[r.x-1][r.y]>=tim[r.x][r.y]+2&&G[r.x-1][r.y]==0&&r.x-1>=0 )
{
//book=1;
tim[r.x-1][r.y]=min(tim[r.x-1][r.y],tim[r.x][r.y]+2);
vis[r.x-1][r.y]=1;
item t2;
t2.x=r.x-1;
t2.y=r.y;
t2.op='N';
q.push(t2);
}
if(tim[r.x][r.y-3]>=tim[r.x][r.y]+3&&G[r.x][r.y-3]==0&&r.y-3>=0)
{
//book=1;
tim[r.x][r.y-3]=min(tim[r.x][r.y-3],tim[r.x][r.y]+3);
vis[r.x][r.y-3]=1;
item t2;
t2.x=r.x;
t2.y=r.y-3;
t2.op='W';
q.push(t2);
}
if(tim[r.x][r.y-2]>=tim[r.x][r.y]+3&&G[r.x][r.y-2]==0&&r.y-2>=0)
{
//book=1;
tim[r.x][r.y-2]=min(tim[r.x][r.y-2],tim[r.x][r.y]+3);
vis[r.x][r.y-2]=1;
item t2;
t2.x=r.x;
t2.y=r.y-2;
t2.op='W';
q.push(t2);
}
if(tim[r.x][r.y-1]>=tim[r.x][r.y]+3&&G[r.x][r.y-1]==0&&r.y-1>=0)
{
//book=1;
tim[r.x][r.y-1]=min(tim[r.x][r.y-1],tim[r.x][r.y]+3);
vis[r.x][r.y-1]=1;
item t2;
t2.x=r.x;
t2.y=r.y-1;
t2.op='W';
q.push(t2);
}
}
if(r.op=='W')
{
if(tim[r.x][r.y-3]>=tim[r.x][r.y]+1&&G[r.x][r.y-3]==0&&r.y-3>=0)
{
//book=1;
tim[r.x][r.y-3]=min(tim[r.x][r.y-3],tim[r.x][r.y]+1);
vis[r.x][r.y-3]=1;
item t2;
t2.x=r.x;
t2.y=r.y-3;
t2.op='W';
q.push(t2);
}
if(tim[r.x][r.y-2]>=tim[r.x][r.y]+1&&G[r.x][r.y-2]==0&&r.y-2>=0)
{
//book=1;
tim[r.x][r.y-2]=min(tim[r.x][r.y-2],tim[r.x][r.y]+1);
vis[r.x][r.y-2]=1;
item t2;
t2.x=r.x;
t2.y=r.y-2;
t2.op='W';
q.push(t2);
}
if(tim[r.x][r.y-1]>=tim[r.x][r.y]+1&&G[r.x][r.y-1]==0&&r.y-1>=0)
{
//book=1;
tim[r.x][r.y-1]=min(tim[r.x][r.y-1],tim[r.x][r.y]+1);
vis[r.x][r.y-1]=1;
item t2;
t2.x=r.x;
t2.y=r.y-1;
t2.op='W';
q.push(t2);
}
if(tim[r.x+3][r.y]>=tim[r.x][r.y]+2&&G[r.x+3][r.y]==0&&r.x+3<=N)
{
//book=1;
tim[r.x+3][r.y]=min(tim[r.x+3][r.y],tim[r.x][r.y]+2);
vis[r.x+3][r.y]=1;
item t2;
t2.x=r.x+3;
t2.y=r.y;
t2.op='S';
q.push(t2);
}
if(tim[r.x+2][r.y]>=tim[r.x][r.y]+2&&G[r.x+2][r.y]==0&&r.x+2<=N)
{
//book=1;
tim[r.x+2][r.y]=min(tim[r.x+2][r.y],tim[r.x][r.y]+2);
vis[r.x+2][r.y]=1;
item t2;
t2.x=r.x+2;
t2.y=r.y;
t2.op='S';
q.push(t2);
}
if(tim[r.x+1][r.y]>=tim[r.x][r.y]+2&&G[r.x+1][r.y]==0&&r.x+1<=N)
{
//book=1;
tim[r.x+1][r.y]=min(tim[r.x+1][r.y],tim[r.x][r.y]+2);
vis[r.x+1][r.y]=1;
item t2;
t2.x=r.x+1;
t2.y=r.y;
t2.op='S';
q.push(t2);
}
if(tim[r.x-3][r.y]>=tim[r.x][r.y]+2&&G[r.x-3][r.y]==0&&r.x-3>=0)
{
//book=1;
tim[r.x-3][r.y]=min(tim[r.x-3][r.y],tim[r.x][r.y]+2);
vis[r.x-3][r.y]=1;
item t2;
t2.x=r.x-3;
t2.y=r.y;
t2.op='N';
q.push(t2);
}
if(tim[r.x-2][r.y]>=tim[r.x][r.y]+2&&G[r.x-2][r.y]==0&&r.x-2>=0)
{
//book=1;
tim[r.x-2][r.y]=min(tim[r.x-2][r.y],tim[r.x][r.y]+2);
vis[r.x-2][r.y]=1;
item t2;
t2.x=r.x-2;
t2.y=r.y;
t2.op='N';
q.push(t2);
}
if(tim[r.x-1][r.y]>=tim[r.x][r.y]+2&&G[r.x-1][r.y]==0&&r.x-1>=0)
{
//book=1;
tim[r.x-1][r.y]=min(tim[r.x-1][r.y],tim[r.x][r.y]+2);
vis[r.x-1][r.y]=1;
item t2;
t2.x=r.x-1;
t2.y=r.y;
t2.op='N';
q.push(t2);
}
if(tim[r.x][r.y+3]>=tim[r.x][r.y]+3&&G[r.x][r.y+3]==0&&r.y+3<=M)
{
//book=1;
tim[r.x][r.y+3]=min(tim[r.x][r.y+3],tim[r.x][r.y]+3);
vis[r.x][r.y+3]=1;
item t2;
t2.x=r.x;
t2.y=r.y+3;
t2.op='E';
q.push(t2);
}
if(tim[r.x][r.y+2]>=tim[r.x][r.y]+3&&G[r.x][r.y+2]==0&&r.y+2<=M)
{
//book=1;
tim[r.x][r.y+2]=min(tim[r.x][r.y+2],tim[r.x][r.y]+3);
vis[r.x][r.y+2]=1;
item t2;
t2.x=r.x;
t2.y=r.y+2;
t2.op='E';
q.push(t2);
}
if(tim[r.x][r.y+1]>=tim[r.x][r.y]+3&&G[r.x][r.y+1]==0&&r.y+1<=M)
{
//book=1;
tim[r.x][r.y+1]=min(tim[r.x][r.y+1],tim[r.x][r.y]+3);
vis[r.x][r.y+1]=1;
item t2;
t2.x=r.x;
t2.y=r.y+1;
t2.op='E';
q.push(t2);
}
}
if(r.op=='S')
{
if(tim[r.x+3][r.y]>=tim[r.x][r.y]+1&&G[r.x+3][r.y]==0&&r.x+3<=N)
{
//book=1;
tim[r.x+3][r.y]=min(tim[r.x+3][r.y],tim[r.x][r.y]+1);
vis[r.x+3][r.y]=1;
item t2;
t2.x=r.x+3;
t2.y=r.y;
t2.op='S';
q.push(t2);
}
if(tim[r.x+2][r.y]>=tim[r.x][r.y]+1&&G[r.x+2][r.y]==0&&r.x+2<=N)
{
//book=1;
tim[r.x+2][r.y]=min(tim[r.x+2][r.y],tim[r.x][r.y]+1);
vis[r.x+2][r.y]=1;
item t2;
t2.x=r.x+2;
t2.y=r.y;
t2.op='S';
q.push(t2);
}
if(tim[r.x+1][r.y]>=tim[r.x][r.y]+1&&G[r.x+1][r.y]==0&&r.x+1<=N)
{
//book=1;
tim[r.x+1][r.y]=min(tim[r.x+1][r.y],tim[r.x][r.y]+1);
vis[r.x+1][r.y]=1;
item t2;
t2.x=r.x+1;
t2.y=r.y;
t2.op='S';
q.push(t2);
}
if(tim[r.x][r.y-3]>=tim[r.x][r.y]+2&&G[r.x][r.y-3]==0&&r.y-3>=0)
{
//book=1;
tim[r.x][r.y-3]=min(tim[r.x][r.y-3],tim[r.x][r.y]+2);
vis[r.x][r.y-3]=1;
item t2;
t2.x=r.x;
t2.y=r.y-3;
t2.op='W';
q.push(t2);
}
if(tim[r.x][r.y-2]>=tim[r.x][r.y]+2&&G[r.x][r.y-2]==0&&r.y-2>=0)
{
//book=1;
tim[r.x][r.y-2]=min(tim[r.x][r.y-2],tim[r.x][r.y]+2);
vis[r.x][r.y-2]=1;
item t2;
t2.x=r.x;
t2.y=r.y-2;
t2.op='W';
q.push(t2);
}
if(tim[r.x][r.y-1]>=tim[r.x][r.y]+2&&G[r.x][r.y-1]==0&&r.y-1>=0)
{
//book=1;
tim[r.x][r.y-1]=min(tim[r.x][r.y-1],tim[r.x][r.y]+2);
vis[r.x][r.y-1]=1;
item t2;
t2.x=r.x;
t2.y=r.y-1;
t2.op='W';
q.push(t2);
}
if(tim[r.x][r.y+3]>=tim[r.x][r.y]+2&&G[r.x][r.y+3]==0&&r.y+3<=M)
{
//book=1;
tim[r.x][r.y+3]=min(tim[r.x][r.y+3],tim[r.x][r.y]+2);
vis[r.x][r.y+3]=1;
item t2;
t2.x=r.x;
t2.y=r.y+3;
t2.op='E';
q.push(t2);
}
if(tim[r.x][r.y+2]>=tim[r.x][r.y]+2&&G[r.x][r.y+2]==0&&r.y+2<=M)
{
//book=1;
tim[r.x][r.y+2]=min(tim[r.x][r.y+2],tim[r.x][r.y]+2);
vis[r.x][r.y+2]=1;
item t2;
t2.x=r.x;
t2.y=r.y+2;
t2.op='E';
q.push(t2);
}
if(tim[r.x][r.y+1]>=tim[r.x][r.y]+2&&G[r.x][r.y+1]==0&&r.y+1<=M)
{
//book=1;
tim[r.x][r.y+1]=min(tim[r.x][r.y+1],tim[r.x][r.y]+2);
vis[r.x][r.y+1]=1;
item t2;
t2.x=r.x;
t2.y=r.y+1;
t2.op='E';
q.push(t2);
}
if(tim[r.x-3][r.y]>=tim[r.x][r.y]+3&&G[r.x-3][r.y]==0&&r.x-3>=0)
{
//book=1;
tim[r.x-3][r.y]=min(tim[r.x-3][r.y],tim[r.x][r.y]+3);
vis[r.x-3][r.y]=1;
item t2;
t2.x=r.x-3;
t2.y=r.y;
t2.op='N';
q.push(t2);
}
if(tim[r.x-2][r.y]>=tim[r.x][r.y]+3&&G[r.x-2][r.y]==0&&r.x-2>=0)
{
//book=1;
tim[r.x-2][r.y]=min(tim[r.x-2][r.y],tim[r.x][r.y]+3);
vis[r.x-2][r.y]=1;
item t2;
t2.x=r.x-2;
t2.y=r.y;
t2.op='N';
q.push(t2);
}
if(tim[r.x-1][r.y]>=tim[r.x][r.y]+3&&G[r.x-1][r.y]==0&&r.x-1>=0)
{
//book=1;
tim[r.x-1][r.y]=min(tim[r.x-1][r.y],tim[r.x][r.y]+3);
vis[r.x-1][r.y]=1;
item t2;
t2.x=r.x-1;
t2.y=r.y;
t2.op='N';
q.push(t2);
}
}
if(r.op=='N')
{
if(tim[r.x-3][r.y]>=tim[r.x][r.y]+1&&G[r.x-3][r.y]==0&&r.x-3>=0)
{
//book=1;
tim[r.x-3][r.y]=min(tim[r.x-3][r.y],tim[r.x][r.y]+1);
vis[r.x-3][r.y]=1;
item t2;
t2.x=r.x-3;
t2.y=r.y;
t2.op='N';
q.push(t2);
}
if(tim[r.x-2][r.y]>=tim[r.x][r.y]+1&&G[r.x-2][r.y]==0&&r.x-2>=0)
{
//book=1;
tim[r.x-2][r.y]=min(tim[r.x-2][r.y],tim[r.x][r.y]+1);
vis[r.x-2][r.y]=1;
item t2;
t2.x=r.x-2;
t2.y=r.y;
t2.op='N';
q.push(t2);
}
if(tim[r.x-1][r.y]>=tim[r.x][r.y]+1&&G[r.x-1][r.y]==0&&r.x-1>=0)
{
//book=1;
tim[r.x-1][r.y]=min(tim[r.x-1][r.y],tim[r.x][r.y]+1);
vis[r.x-1][r.y]=1;
item t2;
t2.x=r.x-1;
t2.y=r.y;
t2.op='N';
q.push(t2);
}
if(tim[r.x][r.y-3]>=tim[r.x][r.y]+2&&G[r.x][r.y-3]==0&&r.y-3>=0)
{
//book=1;
tim[r.x][r.y-3]=min(tim[r.x][r.y-3],tim[r.x][r.y]+2);
vis[r.x][r.y-3]=1;
item t2;
t2.x=r.x;
t2.y=r.y-3;
t2.op='W';
q.push(t2);
}
if(tim[r.x][r.y-2]>=tim[r.x][r.y]+2&&G[r.x][r.y-2]==0&&r.y-2>=0)
{
//book=1;
tim[r.x][r.y-2]=min(tim[r.x][r.y-2],tim[r.x][r.y]+2);
vis[r.x][r.y-2]=1;
item t2;
t2.x=r.x;
t2.y=r.y-2;
t2.op='W';
q.push(t2);
}
if(tim[r.x][r.y-1]>=tim[r.x][r.y]+2&&G[r.x][r.y-1]==0&&r.y-1>=0)
{
//book=1;
tim[r.x][r.y-1]=min(tim[r.x][r.y-1],tim[r.x][r.y]+2);
vis[r.x][r.y-1]=1;
item t2;
t2.x=r.x;
t2.y=r.y-1;
t2.op='W';
q.push(t2);
}
if(tim[r.x][r.y+3]>=tim[r.x][r.y]+2&&G[r.x][r.y+3]==0&&r.y+3<=M)
{
//book=1;
tim[r.x][r.y+3]=min(tim[r.x][r.y+3],tim[r.x][r.y]+2);
vis[r.x][r.y+3]=1;
item t2;
t2.x=r.x;
t2.y=r.y+3;
t2.op='E';
q.push(t2);
}
if(tim[r.x][r.y+2]>=tim[r.x][r.y]+2&&G[r.x][r.y+2]==0&&r.y+2<=M)
{
//book=1;
tim[r.x][r.y+2]=min(tim[r.x][r.y+2],tim[r.x][r.y]+2);
vis[r.x][r.y+2]=1;
item t2;
t2.x=r.x;
t2.y=r.y+2;
t2.op='E';
q.push(t2);
}
if(tim[r.x][r.y+1]>=tim[r.x][r.y]+2&&G[r.x][r.y+1]==0&&r.y+1<=M)
{
//book=1;
tim[r.x][r.y+1]=min(tim[r.x][r.y+1],tim[r.x][r.y]+2);
vis[r.x][r.y+1]=1;
item t2;
t2.x=r.x;
t2.y=r.y+1;
t2.op='E';
q.push(t2);
}
if(tim[r.x+3][r.y]>=tim[r.x][r.y]+3&&G[r.x+3][r.y]==0&&r.x+3<=N)
{
//book=1;
tim[r.x+3][r.y]=min(tim[r.x+3][r.y],tim[r.x][r.y]+3);
vis[r.x+3][r.y]=1;
item t2;
t2.x=r.x+3;
t2.y=r.y;
t2.op='S';
q.push(t2);
}
if(tim[r.x+2][r.y]>=tim[r.x][r.y]+3&&G[r.x+2][r.y]==0&&r.x+2<=N)
{
//book=1;
tim[r.x+2][r.y]=min(tim[r.x+2][r.y],tim[r.x][r.y]+3);
vis[r.x+2][r.y]=1;
item t2;
t2.x=r.x+2;
t2.y=r.y;
t2.op='S';
q.push(t2);
}
if(tim[r.x+1][r.y]>=tim[r.x][r.y]+3&&G[r.x+1][r.y]==0&&r.x+1<=N)
{
//book=1;
tim[r.x+1][r.y]=min(tim[r.x+1][r.y],tim[r.x][r.y]+3);
vis[r.x+1][r.y]=1;
item t2;
t2.x=r.x+1;
t2.y=r.y;
t2.op='S';
q.push(t2);
}
}
}
}
int main()
{
//freopen("ss.txt","r",stdin);
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)
{
scanf("%d",&P[i][j]);
}
}
scanf("%d%d%d%d",&SX,&SY,&EX,&EY);
scanf(" %c",&opt);
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M+1;j++)
{
G[i][j]=0;
}
}
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)
{
if(P[i][j]==1)
{
G[i][j]=1;
G[i-1][j]=1;
G[i][j-1]=1;
G[i-1][j-1]=1;
}
}
}
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)
{
tim[i][j]=2147483647;
if(i==SX&&j==SY)
{
tim[i][j]=0;
}
}
}
item t;
t.x=SX;
t.y=SY;
t.op=opt;
bfs(t);
for(int i=0;i<=N;i++)
{
for(int j=0;j<=M;j++)
{
printf("%d ",G[i][j]);
}
cout<<endl;
}
for(int i=0;i<=N;i++)
{
for(int j=0;j<=M;j++)
{
printf("%d ",tim[i][j]);
}
cout<<endl;
}
if(tim[EX][EY]!=2147483647)
{
printf("%d",tim[EX][EY]);
}
else
{
printf("-1");
}
return 0;
}
换了个思路之后的AC代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<cstdlib>
using namespace std;
const int MAXN = 55;
int G[MAXN][MAXN];
int opt;
int vis[MAXN][MAXN][4];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int N,M;
int SX,SY,EX,EY;
char op;
int nx,ny;
struct item
{
int x;
int y;
int f;
int cnt;
};
queue<item>q;
bool ob(int x,int y)
{
if(G[x][y]||G[x+1][y]||G[x][y+1]||G[x+1][y+1])
{
return 1;
}
return 0;
}
void bfs(item t)
{
int x,y,f,cnt;
q.push(t);
while(!q.empty())
{
item r;
r=q.front();
q.pop();
x=r.x;
y=r.y;
f=r.f;
cnt=r.cnt;
//printf( "x=%d y=%d f=%d cnt=%d\n", x, y, f, cnt );
if(x==EX&&y==EY)
{
printf("%d",cnt);
exit(0);
}
r.cnt++;
r.f=(f+3)%4;
if( vis[r.x][r.y][r.f] != 1 )
q.push(r), vis[r.x][r.y][r.f] = 1;
r.f=(f+5)%4;
if( vis[r.x][r.y][r.f] != 1 )
q.push(r), vis[r.x][r.y][r.f] = 1;
r.f=f;
for(int i=1;i<=3;i++)
{
nx=x+dx[f]*i;
ny=y+dy[f]*i;
if(nx<=0||nx>=N||ny<=0||ny>=M||ob(nx,ny)) break;
r.x=nx;
r.y=ny;
if( vis[r.x][r.y][r.f] != 1 )
q.push(r), vis[r.x][r.y][r.f] = 1;
}
}
}
int main()
{
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++)
{
for(int j=1;j<=M;j++)
{
scanf("%d",&G[i][j]);
}
}
scanf("%d%d%d%d",&SX,&SY,&EX,&EY);
cin>>op;
if(op=='N') opt=0;
else if(op=='E') opt=1;
else if(op=='S') opt=2;
else if(op=='W') opt=3;
item t;
t.x=SX;
t.y=SY;
t.f=opt;
t.cnt=0;
bfs(t);
printf("-1");
return 0;
}
原文:https://www.cnblogs.com/LITTLESUNwl/p/10703358.html