poj2049——Finding Nemo

    技术2026-08-12  1

    题意:迷宫问题

    注意:1,建图方式,需要两二维数组来分别记录横、竖边的信息。2,需优先队列跳过自己添加的边。3,将格子问题转化为点问题。

    #include<iostream> #include<cstring> using namespace std; class wall { public: int x,y,d,l; }; class doo { public: int x,y,d; }; wall wa;doo door; int m,n,xmax,ymax; double nx,ny; #define max_size 300 #define maxcost 1000000 int dist[max_size][max_size],vEdge[max_size][max_size],hEdge[max_size][max_size];//采用两二维数组来保存墙和门的信息 class pri_queue { public: int x,y; int p; }; pri_queue queue[256*256]; int top; void Delete() { top--; int i,flag=top; for(i=1;i<top;i++) if(queue[i].p <queue[flag].p ) flag=i; queue[0]=queue[flag];queue[flag]=queue[top]; } void Input(pri_queue t) { if(t.p<queue[0].p) { queue[top]=queue[0]; queue[0]=t;} else queue[top]=t; top++; } void solve() { int i,j,x,y; for(i=0;i<=xmax+1;i++) for(j=0;j<=ymax+1;j++) dist[i][j]=maxcost; top=0; pri_queue t,p; t.x=0;t.y=0;t.p =0; dist[0][0]=0; queue[top]=t; top++; while(top>=0) { t=queue[0];Delete(); x=t.x;y=t.y; if(x==(int)nx&&y==(int)ny) { cout<<t.p<<endl; return ; } if(y+1<=ymax&&dist[x][y+1]>dist[x][y]+vEdge[x][y+1]) { dist[x][y+1]=dist[x][y]+vEdge[x][y+1]; p.x=x;p.y=y+1;p.p=dist[x][y+1]; Input(p); } if(y-1>=0&&dist[x][y-1]>dist[x][y]+vEdge[x][y]) { dist[x][y-1]=dist[x][y]+vEdge[x][y]; p.x=x;p.y=y-1;p.p=dist[x][y-1]; Input(p); } if(x-1>=0&&dist[x-1][y]>dist[x][y]+hEdge[x][y]) { dist[x-1][y]=dist[x][y]+hEdge[x][y]; p.x=x-1;p.y=y;p.p=dist[x-1][y]; Input(p); } if(x+1<=xmax&&dist[x+1][y]>dist[x][y]+hEdge[x+1][y]) { dist[x+1][y]=dist[x][y]+hEdge[x+1][y]; p.x=x+1;p.y=y;p.p=dist[x+1][y]; Input(p); } } cout<<-1<<endl; } int main() { while(1) { cin>>m>>n; if(m==-1&&n==-1) break; int i,j;xmax=0;ymax=0; memset(vEdge,0,sizeof(vEdge)); memset(hEdge,0,sizeof(hEdge)); for(i=0;i<m;i++) { cin>>wa.x>>wa.y>>wa.d>>wa.l; if(wa.d==0) { for(j=0;j<wa.l ;j++) vEdge[wa.x+j][wa.y]=maxcost; if(wa.y>ymax) ymax=wa.y; if(wa.x+wa.l >xmax) xmax=wa.x+wa.l; } else { for(j=0;j<wa.l ;j++) hEdge[wa.x][wa.y+j]=maxcost; if(wa.y+wa.l >ymax) ymax=wa.y+wa.l; if(wa.x>xmax) xmax=wa.x; } } for(i=0;i<n;i++) { cin>>door.x>>door.y>>door.d; if(door.d ==0) vEdge[door.x][door.y]=1; else hEdge[door.x][door.y]=1; } cin>>nx>>ny; if(nx>xmax||ny>ymax) cout<<'0'<<endl; else solve(); } return 0; }

    最新回复(0)