http://poj.org/problem?id=2049
题意:有一个迷宫,迷宫中有墙、门和空地。有M道墙,每一道墙用(x,y,d,t)表示,(x,y)表示墙的起始坐标,(d=1,t)表示向上t个单位都是墙;(d=0,t)表示向右t个单位都是墙。
有N扇门,用(x,y,d)表示,(x,y)表示门的起始坐标,d=1,表示向上一个单位都是门;d=0,表示向右一个单位都是门。 给出Nemo的起始位置(f1,f2),问起点到(0,0)的最少要穿过的门。
表示对搜索的题很晕。。看到题不知道该怎么存,看了别人的题解才懂点。。
1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <queue> 5 using namespace std; 6 const int INF=1<<28; 7 const int N=220; 8 int dir[4][2]= {{-1,0},{1,0},{0,-1},{0,1}}; 9 int xx[N][N],yy[N][N]; 10 int dis[N][N]; 11 int max_x,max_y; 12 int boundary(int x,int y)//边界判断 13 { 14 if(x>0 && x<=max_x && y<=max_y && y>0) 15 return 1; 16 return 0; 17 } 18 int change(int x,int y,int d)//方向转换 19 { 20 if(d==0) return yy[x-1][y]; 21 if(d==1) return yy[x][y]; 22 if(d==2) return xx[x][y-1]; 23 return xx[x][y]; 24 } 25 int bfs(int x,int y) 26 { 27 queue<int>q; 28 while(!q.empty()) q.pop(); 29 for (int i = 1; i <= max_y; i++) 30 { 31 for (int j = 1; j <= max_x; j++) 32 dis[i][j] = INF; 33 } 34 dis[1][1]=0; 35 q.push(1); 36 q.push(1); 37 while(!q.empty()) 38 { 39 int x1=q.front(); 40 q.pop(); 41 int y1=q.front(); 42 q.pop(); 43 for (int i = 0; i < 4; i++) 44 { 45 int dx = x1+dir[i][0]; 46 int dy = y1+dir[i][1]; 47 int turn = change(x1,y1,i); 48 if(boundary(dx,dy) && dis[dx][dy]>dis[x1][y1]+turn) 49 { 50 dis[dx][dy]=dis[x1][y1]+turn;//更新最小步数 51 q.push(dx); 52 q.push(dy); 53 } 54 } 55 } 56 int ans = dis[x][y]==INF?-1:dis[x][y]; 57 return ans; 58 } 59 int main() 60 { 61 int n,m; 62 int x,y,d,l; 63 while(~scanf("%d%d",&n,&m)) 64 { 65 if(n==-1&&m==-1) break; 66 max_x = max_y = -1; 67 memset(xx,0,sizeof(xx)); 68 memset(yy,0,sizeof(yy)); 69 for (int i = 0; i < n; i++) 70 { 71 scanf("%d%d%d%d",&x,&y,&d,&l); 72 if(d) 73 { 74 for (int j = 0; j < l; j++) 75 yy[x][y+j+1]=INF; 76 max_y=max(y+l+1,max_y); 77 max_x=max(x+1,max_x); 78 } 79 else 80 { 81 for (int j = 0; j < l; j++) 82 { 83 xx[x+j+1][y]=INF; 84 max_y=max(y+1,max_y); 85 max_x=max(x+l+1,max_x); 86 } 87 } 88 } 89 for (int i = 0; i < m; i++) 90 { 91 scanf("%d%d%d",&x,&y,&d); 92 if(d) yy[x][y+1]=1; 93 else xx[x+1][y]=1; 94 } 95 double sx,sy; 96 int sx1,sy1; 97 scanf("%lf%lf",&sx,&sy); 98 sx1 = (int)sx+1; 99 sy1 = (int)sy+1; 100 if(!(sx>=1 && sx<=199 && sy>=1 && sy<=199))//Nemo可能在迷宫外 101 printf("0 "); 102 else 103 printf("%d ",bfs(sx1,sy1)); 104 } 105 return 0; 106 }