POJ1376

来源:互联网 发布:virtualbox使用教程mac 编辑:程序博客网 时间:2024/06/05 19:11
#include<iostream>#include<queue>#include<cstdio>#define inf 10e6using namespace std;struct node{int x,y,f,step;};int dir[4][2]={0,1,1,0,0,-1,-1,0};int n,m,ex,ey;int g[55][55],dis[55][55][4];char face[20];node start;bool can(int x,int y,node cur)    {    return x>0 && x<n && y>0 && y<m && (cur.step+1<dis[x][y][cur.f]);}int bfs(){queue<node> q;while(!q.empty()) q.pop();q.push(start);while(!q.empty()){node cur = q.front();if(cur.x==ex && cur.y==ey)   return cur.step;if(cur.step+1<dis[cur.x][cur.y][(cur.f+1)%4]){node np;np=cur;np.step++;np.f=(cur.f+1)%4;q.push(np);dis[cur.x][cur.y][(cur.f+1)%4] = cur.step;}if(cur.step+1<dis[cur.x][cur.y][(cur.f+3)%4]){node np;np=cur;np.step++;np.f=(cur.f+3)%4;q.push(np);dis[cur.x][cur.y][(cur.f+3)%4] = cur.step;}for(int i=1;i<=3;i++){int nx = cur.x + i*dir[cur.f][0];int ny = cur.y + i*dir[cur.f][1];if(g[nx][ny]==1) break;if(can(nx,ny,cur)){node np;np=cur;np.x=nx;np.y=ny;np.step++;q.push(np);dis[np.x][np.y][np.f] = np.step;}}q.pop(); }return -1;}int main(){int t;while(scanf("%d%d",&n,&m)!=EOF && n!=0 && m!=0) {memset(g,0,sizeof(g));for(int i=0;i<n;i++) for(int j=0;j<m;j++) { int temp;        cin>>temp;                            if (temp==1)        {           g[i][j]=g[i][j+1]=g[i+1][j]=g[i+1][j+1]=1;              }           dis[i][j][0]=dis[i][j][1]=dis[i][j][2]=dis[i][j][3]=inf; }scanf("%d%d%d%d%s",&start.x,&start.y,&ex,&ey,face);  if(face[0]=='e') t=0;else if(face[0]=='s') t=1;else if(face[0]=='w') t=2;else if(face[0]=='n') t=3;start.f=t;start.step=0;cout<<bfs()<<endl;}return 0;}

0 0
原创粉丝点击