Finding Nemo(搜索)

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\n");
102         else
103             printf("%d\n",bfs(sx1,sy1));
104     }
105     return 0;
106 }
View Code

 

posted @ 2014-02-24 20:59  N_ll  阅读(263)  评论(0编辑  收藏  举报